如何根据位置指示符在R中交织向量

时间:2016-02-19 17:58:19

标签: r

有没有办法在R中执行矢量的受控交错?也就是说,假设我有多个向量v1v2v3包含值和位置向量,如下所示:

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)

1pos的数量始终等于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个元素,同样适用于posv1,......

我试图将其与v2循环一起破解,如下所示:

v3

但是虽然这个似乎来完成工作,但这是一个非常混乱的解决方案,我希望有一些更优雅和时间效率更适合我for的真实情况有数百万条目。

1 个答案:

答案 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