gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:45:04 25 4
gpt4 key购买 nike

假设我有三个向量a.1a.2a.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 的所有元素,但索引 23 处的元素除外5 和索引 23 来自向量 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

我想知道是否有更好的方法来做到这一点——更好的可能包括:

  1. 更优雅
  2. 可扩展为多个元素拼接
  3. 更简洁(语法方面)

注意事项

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

最佳答案

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com