假设我有三个向量 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
我想知道是否有更好的方法 - 更好的方法可能包括:
备注
答案 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)