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

标签 r

假设我有三个向量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/

相关文章:

javascript - 在 R Highchart 中,如何用不同的颜色为折线图的不同部分着色

r - 合并和替换重叠矩阵中的值

r - R语言获取字符 "\n 0.28\n\n "的数字

R:使用特定的构造函数创建新的类后代到 "data.frame"

r - 如何在 R Shiny 中获取用户信息

r - 频率表的累积概率图

r - 具有与值对相关的随机实验的函数

r - data.table 将生成的多列分配为新的 data.table(或列表)而不重复名称

r - openxlsx错误: length of rows and cols must be equal

r - 在 R markdown 中对齐所有 knitr 表