r - cbind 有效地从多个 data.tables 中绑定(bind)特定列

标签 r data.table cbind

我有一个需要 cbind 的 data.tables 列表,但是,我只需要最后 X 列。

我的数据结构如下:

DT.1 <- data.table(x=c(1,1), y = c("a","a"), v1 = c(1,2), v2 = c(3,4))
DT.2 <- data.table(x=c(1,1), y = c("a","a"), v3 = c(5,6))
DT.3 <- data.table(x=c(1,1), y = c("a","a"), v4 = c(7,8), v5 = c(9,10), v6 = c(11,12))

DT.list <- list(DT.1, DT.2, DT.3)
>DT.list
    [[1]]
   x y v1 v2
1: 1 a  1  3
2: 1 a  2  4

[[2]]
   x y v3
1: 1 a  5
2: 1 a  6

[[3]]
   x y v4 v5 v6
1: 1 a  7  9 11
2: 1 a  8 10 12

每个 data.tables 的 x 和 y 列都相同,但列的数量不同。输出不应包含重复的 x 和 y 列。它应该如下所示:
   x y v1 v2 v3 v4 v5 v6
1: 1 a  1  3  5  7  9 11
2: 1 a  2  4  6  8 10 12

我想避免使用循环。我可以使用 do.call("cbind", DT.list) 绑定(bind) data.tables然后手动删除重复项,但是有没有办法首先不创建重复项?此外,效率很重要,因为列表可能很长,data.tables 很大。

谢谢

最佳答案

这是另一种方式:

Reduce(
  function(x,y){
    newcols = setdiff(names(y),names(x))
    x[,(newcols)] <- y[, ..newcols]
    x
  }, 
  DT.list,
  init = copy(DT.list[[1]][,c("x","y")])
)
#    x y v1 v2 v3 v4 v5 v6
# 1: 1 a  1  3  5  7  9 11
# 2: 1 a  2  4  6  8 10 12

这避免了修改列表(就像@bgoldst 的 <- NULL 分配所做的那样)或复制列表的每个元素(我认为 lapply 方法确实如此)。我可能会做 <- NULL不过,在大多数实际应用中都是如此。

关于r - cbind 有效地从多个 data.tables 中绑定(bind)特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430892/

相关文章:

r - Predict.glmnet() 使用 family = "link"对 type = "response"和 "binomial"给出相同的预测

r - 在 R 图形中,绘制字符 (pch) 16 和 19 之间有什么不同?

r - 当表通过选择列为 ("index"时,data.table 中的辅助键 "copied"属性会丢失

r - 如何创建带有数字和字符列的数据框?

R Shiny : Creating New Columns Within a Reactive Data Frame

r - 嵌套列表到单个表(按列名称合并?)

r - 无法安装 gdtools 或 svglite

r - 在 data.table 中动态创建新列

r - 对特定列的 data.table 行求和

r - 使用 data.table 按与另一行的距离选择行