在R中按顺序拼接事物(向量和数据帧)的优雅方法是什么?

时间:2017-05-30 21:39:22

标签: r

假设我有三个向量 a.1 a.2 a.3 - 它们可以包含任意值(意味着值不一定要排序)

> a.1 <- seq(1,15,3)
> a.2 <- seq(15,2,-3)
> a.3 <- seq(2,15,3)
> a.1
[1]  1  4  7 10 13
> a.2
[1] 15 12  9  6  3
> a.3
[1]  2  5  8 11 14

现在我想要生成一个新的向量 C ,其中我采用 a 的所有元素,但索引 2 的元素除外, 3 5 ,且只有来自 a.2 的索引 2 3 的元素和元素at指数 5 来自 a.3 ;按顺序组合它们

我知道如何做到这一点的一种方式是:

> C <- a.1
> C[c(2,3)] <- a.2[c(2,3)]
> C[5] <- a.3[5]
> C
[1]  1 12  9 10 14

我想知道是否有更好的方法 - 更好的方法可能包括:

  1. 更优雅
  2. 可扩展以说明来自多个元素的拼接
  3. 更多Terse(语法明智)
  4. 备注

    1. 其中一位作者建议使用替换 - 我想知道是否可以在多路拼接中使用替换
    2. 另请注意,源或目标向量中的值不需要排序
    3. 如果可以在矢量和数据帧上使用相同的解决方案(除非进行一些小修改),那就太棒了

2 个答案:

答案 0 :(得分:4)

在这种情况下,我只使用一个无聊的旧循环并覆盖每个对象的相应索引:

multchange <- function(x, repl, idx) {
  for (i in seq_along(repl)) {
    x[idx[[i]]] <- repl[[i]][idx[[i]]]
  }
  x
}

df_list <- list(a.2, a.3)
cool_list <- list(c(2,3), 5)
multchange(a.1, df_list, cool_list)
#[1]  1 12  9 10 14

不,在大型数据集上使用循环并不慢:

samp <- rep(1:2,each=1000000)
df_list <- list(a.2, a.3)[samp]
cool_list <- list(c(2,3), 5)[samp]

system.time({
  multchange(a.1, df_list, cool_list)
})
#   user  system elapsed 
#   4.24    0.00    4.25 

c <- a.1
system.time({
  mapply(function(X, Y) { c[Y] <<- X[Y] }, X=df_list, Y=cool_list)
})
#   user  system elapsed 
#   7.46    0.00    7.49 

答案 1 :(得分:1)

df_list <- list(a.2, a.3)
cool_list <- list(c(2,3), 5)
c <- a.1
mapply(function(X, Y) { c[Y] <<- X[Y] }, X=df_list, Y=cool_list)