Hüsamettin Tayşi
Hüsamettin Tayşi

Reputation: 574

how to interpolate date for specific number of values in r?

This is my data:

data<-c(10, 20, 55, 80, 73, 58, 46, 36, 27.5, 20, 15, 13, 11)

As it is seen, number of values is 13. But I want it to be 289 values. To perform this, I want to interpolate my data like:

10.0 10.2 10.3 10.5 ... 20.0 20.4.. 21.0...55....80...

Briefly, I want to assign values between the values of data. The range between two value is not important. But the important thing is, the number of values will be 289. Sorry for my bad narrative

Upvotes: 0

Views: 144

Answers (3)

Mario Niepel
Mario Niepel

Reputation: 1165

A little easier answer:

data <- c(10, 20, 55, 80, 73, 58, 46, 36, 27.5, 20, 15, 13, 11)
maxlength <- 315
interpolated_data <- vector()

for (i in 1:(length(data)-1)) {
     interpolated_data <- c(interpolated_data, seq(data[i], data[i+1], length=as.integer((maxlength)/(length(data)-1)))) 
}

while (length(interpolated_data)<maxlength) {
     interpolated_data <- c(interpolated_data, interpolated_data[length(interpolated_data)])
}

I'm not sure how you want to handle the case for additional elements that can't be evenly spaced into the intervals. You can use the while loop to sort out that behavior. For now I simply added the last element again, but it's your choice.

Upvotes: 1

Carlos M.
Carlos M.

Reputation: 373

This gets a little iffy on the in-between sortedness of the numbers, but it does fill in values.

datavector <- c(10, 20, 55, 80, 73, 58, 46, 36, 27.5, 20, 15, 13, 11)
desired_length <- 289

make_longer <- function(datavector, desired_length, seed = 4){ 
  
  # floor should ensure you either reach or meet the desired length but 
  # never exceed it 
  multiple <- floor(desired_length/length(datavector))
  set.seed(seed)
  
  holder = NULL
  for(i in 1: (length(datavector)-1) ){ 
    
  min = min( c(datavector[i], datavector[i+1]) )
  max = max( c(datavector[i], datavector[i+1]) )
  
  holder = c(holder, datavector[i],  
             sort ( runif(n = multiple, min = min, max = max ) ) ,
  datavector[i+1])
  }
  
  if(length(holder) < desired_length){ 
    fill_count = desired_length - length(holder)
    
    # store various final values 
    temp_holder = holder[-length(holder)]
    new_min = min( c(holder[length(holder)-1],holder[length(holder)]) )
    new_max = max( c(holder[length(holder)-1],holder[length(holder)]) )
    
    final_holder <- c(temp_holder, sort(
      runif(n = fill_count, min = new_min, max = new_max)
    ) , holder[length(holder)])
    
    return(final_holder)
  } else { 
    return(holder)  
    }

  }

Plot of result for your numbers and seed = 4

Upvotes: 0

Mario Niepel
Mario Niepel

Reputation: 1165

It's not clear to me exactly how you want to interpolate between the different values. But the easiest solution is if you simply want values spaced between the minimum and maximum value of the original 13 values to use seq:

data <- seq(min(data), max(data), length=289)

Of course if you mean that you want to add 289 values the line should be:

data <- seq(min(data), max(data), length=289+length(data))

Upvotes: 0

Related Questions