我有两个大数据表DT1(2M行x 300列)和DT2(5000万行x 2列),我想根据列名将DT1列的值合并到DT2中的新列在DT2列中指定。我想实现此目标而不必融合DT1,并尽可能使用data.table操作。
Hora,样本数据集。

> require(data.table)
> DT1 <- data.table(ID = c('A', 'B', 'C', 'D'), col1 = (1:4), col2 = (5:8), col3 = (9:12), col4 = (13:16))
> DT1
   ID col1 col2 col3 col4
1:  A    1    5    9   13
2:  B    2    6   10   14
3:  C    3    7   11   15
4:  D    4    8   12   16

> DT2
   ID  col
1:  A col1
2:  B col2
3:  B col3
4:  C col1
5:  A col4

#desired output
> DT2_merge
   ID  col col_value
1:  A col1         1
2:  B col2         6
3:  B col3        10
4:  C col1         3
5:  A col4        13


由于处理两个大的data.tables,希望找到最有效的方法。

最佳答案

使用set()

setkey(DT1, "ID")
setkey(DT2, "ID")
for (k in names(DT1)[-1]) {
  rows <- which(DT2[["col"]] == k)
  set(DT2, i = rows, j = "col_value", DT1[DT2[rows], ..k])
}

   ID  col col_value
1:  A col1         1
2:  A col4        13
3:  B col2         6
4:  B col3        10
5:  C col1         3


注意:预先设置键可以加快过程,但可以对行进行重新排序。

10-07 21:30