假设我有三个向量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 和索引 2、3 来自向量 a.2 的元素和位于a.3 中的索引 5;按顺序组合它们
我知道如何做到这一点的一种方法是:
> C <- a.1
> C[c(2,3)] <- a.2[c(2,3)]
> C[5] <- a.3[5]
> C
[1] 1 12 9 10 14
我想知道是否有更好的方法来做到这一点——更好的可能包括:
- 更优雅
- 可扩展为多个元素拼接
- 更简洁(语法方面)
注意事项
- 其中一个答案作者建议使用 replace -- 我想知道 replace 是否可以用于多路拼接
- 另请注意源向量或目标向量中的值不需要排序
- 如果可以在向量和数据帧上使用相同的解决方案(除非有一些小的修改),那就太好了
最佳答案
在这种情况下,我只使用一个无聊的旧循环并覆盖每个对象的相应索引:
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
关于r - 在 R 中按顺序拼接事物(向量和数据帧)的优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44272398/