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

Emp*_*cer 1 r

有没有办法在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)
Run Code Online (Sandbox Code Playgroud)

它始终是的数量的情况下1S IN pos等于在元件的数目v1等,即all.equal(c(length(v1), length(v2), length(v3)), as.vector(table(pos)))TRUE.

我想是某种方式来交织根据所述值的矢量pos,即,创建矢量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]),其中对应于第n个外观条目1pos是第n个元件v1,并且同样地用于v2,v3...

我试图用for循环来破解它,就像这样:

v <- list(v1, v2, v3)
for (p in 1:length(pos)) {
    ind <- pos[1:p] == pos[p]
    i[p] <- v[[pos[p]]][cumsum(ind)[p]]
}
i
#> [1] "a" "b" "1" "x" "2" "3" "y" "4" "c" "z" "5" "d"
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ank 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"
Run Code Online (Sandbox Code Playgroud)

这里也可以避免循环:

i = character(length(pos))
i[ order(pos) ] <- c(v1,v2,v3)
# "a" "b" "1" "x" "2" "3" "y" "4" "c" "z" "5" "d"
Run Code Online (Sandbox Code Playgroud)

作为参考,我看了另一个关于交错的好问题.