Reputation: 574
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
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
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
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