将向量中的值插值/拉伸到指定长度

Interpolation / stretching out of values in vector to a specified length

我有不同长度的向量 例如,

a1 = c(1,2,3,4,5,6,7,8,9,10) a2 = c(1,3,4,5) a3 = c(1,2,5,6,9)

我想将 a2 和 a3 拉长到 a1 的长度,这样我就可以 运行 一些要求向量长度相同的算法。我会 运行将 a1 分类为与 a2 和 a3 相同,但我最终丢失了有价值的数据。

即 a2 可能看起来像 1 1 1 3 3 3 4 4 5 5 ?

任何建议都会很棒! 谢谢

编辑:我需要它来处理具有重复值的向量,例如 c(1,1,2,2,2,2,3,3) 和拉伸值以表示重复值的数量在原始向量中,例如,如果我将示例向量拉伸到 100 的长度,我会期望两个比一个多。

一种方法是在定义长度的两点之间创建一个序列。

#Put the data in a list
list_data <- list(a1 = a1, a2 = a2, a3 = a3)
#Get the max length
max_len <- max(lengths(list_data))
#Create a sequence
list_data <- lapply(list_data, function(x) 
                    seq(min(x), max(x), length.out = max_len))

#$a1
# [1]  1  2  3  4  5  6  7  8  9 10

#$a2
# [1] 1.000 1.444 1.889 2.333 2.778 3.222 3.667 4.111 4.556 5.000

#$a3
# [1] 1.000 1.889 2.778 3.667 4.556 5.444 6.333 7.222 8.111 9.000

如果需要,将它们放在单独的向量中:

list2env(list_data, .GlobalEnv)

但这并不能保证您的原始数据点会保留在数据中。例如,a2 在数据中有 3 和 4,但它不存在于这个修改后的向量中。

听起来您正在寻找类似的东西:

lengthen <- function(vec, length) {
  vec[sort(rep(seq_along(vec), length.out = length))]
}

lengthen(a2, length(a1))
# [1] 1 1 1 3 3 3 4 4 5 5
lengthen(a3, length(a1))
# [1] 1 1 2 2 5 5 6 6 9 9
lengthen(a4, length(a1))
# [1] 5 5 5 1 1 1 3 3 4 4
lengthen(a5, length(a1))
# [1] 1 1 1 1 1 1 4 4 5 5

其中:

a1 = c(1,2,3,4,5,6,7,8,9,10)
a2 = c(1,3,4,5)
a3 = c(1,2,5,6,9)
a4 = c(5,1,3,4)
a5 = c(1,1,4,5)