将向量中的值插值/拉伸到指定长度
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)
我有不同长度的向量 例如,
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)