有没有办法在R中执行矢量的受控交错?也就是说,假设我有多个向量v1
,v2
,v3
包含值和位置向量,如下所示:
v1 <- c("a", "b", "c", "d")
v2 <- c("1", "2", "3", "4", "5")
v3 <- c("x", "y", "z")
pos <- c(1, 1, 2, 3, 2, 2, 3, 2, 1, 3, 2, 1)
1
中pos
的数量始终等于v1
中的元素数量,依此类推,即all.equal(c(length(v1), length(v2), length(v3)), as.vector(table(pos)))
为{{ 1}}。
我想要的是根据TRUE
中的值交错矢量的一些方法,即创建一个向量pos
,其中对应于{{1}的第n个外观的条目} i <- c(v1[1], v1[2], v2[1], v3[1], v2[2], v2[3], v3[2], v2[4], v1[3], v3[3], v2[5], v1[4])
中{}为1
的第n个元素,同样适用于pos
,v1
,......
我试图将其与v2
循环一起破解,如下所示:
v3
但是虽然这个似乎来完成工作,但这是一个非常混乱的解决方案,我希望有一些更优雅和时间效率更适合我for
的真实情况有数百万条目。
答案 0 :(得分:5)
不是迭代位置,而是迭代向量:
i = character(length(pos))
for (p in 1:length(v)) i[ pos == p ] <- v[[p]]
# "a" "b" "1" "x" "2" "3" "y" "4" "c" "z" "5" "d"
这里也可以避免循环:
i = character(length(pos))
i[ order(pos) ] <- c(v1,v2,v3)
# "a" "b" "1" "x" "2" "3" "y" "4" "c" "z" "5" "d"
作为参考,我查看了this other nice question on interleaving。