如何为 r 中的特定数量的值插入日期?
how to interpolate date for specific number of values in r?
这是我的数据:
data<-c(10, 20, 55, 80, 73, 58, 46, 36, 27.5, 20, 15, 13, 11)
正如所见,值的数量是13。但我希望它是289个值。要执行此操作,我想插入我的数据,如:
10.0 10.2 10.3 10.5 ... 20.0 20.4.. 21.0...55....80...
简而言之,我想在数据值之间赋值。两个值之间的范围并不重要。但重要的是,值的数量将是 289。抱歉我的叙述不当
我不清楚您想如何在不同值之间进行插值。但最简单的解决方案是,如果您只是希望值介于原始 13 个值的最小值和最大值之间,则使用 seq:
data <- seq(min(data), max(data), length=289)
当然,如果您的意思是要添加 289 个值,则该行应为:
data <- seq(min(data), max(data), length=289+length(data))
这对数字的中间排序有点不确定,但它确实填充了值。
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
更简单的答案:
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)])
}
我不确定您希望如何处理无法均匀分布在间隔中的其他元素的情况。您可以使用 while
循环来解决该行为。现在我只是再次添加了最后一个元素,但这是您的选择。
这是我的数据:
data<-c(10, 20, 55, 80, 73, 58, 46, 36, 27.5, 20, 15, 13, 11)
正如所见,值的数量是13。但我希望它是289个值。要执行此操作,我想插入我的数据,如:
10.0 10.2 10.3 10.5 ... 20.0 20.4.. 21.0...55....80...
简而言之,我想在数据值之间赋值。两个值之间的范围并不重要。但重要的是,值的数量将是 289。抱歉我的叙述不当
我不清楚您想如何在不同值之间进行插值。但最简单的解决方案是,如果您只是希望值介于原始 13 个值的最小值和最大值之间,则使用 seq:
data <- seq(min(data), max(data), length=289)
当然,如果您的意思是要添加 289 个值,则该行应为:
data <- seq(min(data), max(data), length=289+length(data))
这对数字的中间排序有点不确定,但它确实填充了值。
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
更简单的答案:
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)])
}
我不确定您希望如何处理无法均匀分布在间隔中的其他元素的情况。您可以使用 while
循环来解决该行为。现在我只是再次添加了最后一个元素,但这是您的选择。