[英]How to combine the columns of two data.tables?
我有两张 data.table 类型的表。 我想将这些表合并为一张表。 他们看起来像:
DT1:
1 A B C
2 A B C
3 A B C
DT2:
D E F
D E F
D E F
我想像这样组合它们:
1 A B C D E F
2 A B C D E F
3 A B C D E F
我不知道如何通过合并来做到这一点,因为数据表没有通用的列名。
我知道使用 cbind 可以做到这一点,但我正在处理很多行,所以我更喜欢 function,它是为处理大数据表而构建的。
谁能告诉我该怎么做?
我已经尝试了一些更大的表(使用 Hart microbenchmark
提供的代码)并且我已经对它们进行了微基准测试,也许它可能会有所帮助:
library(dplyr)
library(microbenchmark)
DT1 = data.frame(A = rep('A', 300000), B = rep('B', 300000))
DT2 = data.frame(C = rep('C', 300000), D = rep('D', 300000))
microbenchmark(
bind_cols = {bind_cols(DT1, DT2)},
cbind = {cbind(DT1,DT2)},
# Hart solution
merge = { DT1$rowname = rownames(DT1)
DT2$rowname = rownames(DT2)
DT3 = merge(DT1, DT2, by = 'rowname')}
)
Unit: microseconds
expr min lq mean median uq max neval
bind_cols 72.534 88.9610 1.640497e+02 169.6010 209.4940 348.160 100
cbind 42.241 50.5610 8.019269e+01 61.4405 114.9875 250.455 100
merge 2142101.821 2256677.2310 2.574166e+06 2416274.7380 2732207.2465 5956733.422 100
data.table
不是我的一杯茶,但我想解决它可能会有所帮助。
基于@s_t 答案,这里是使用data.table
的更新连接的基准
DT1 = data.frame(A = rep('A', 300000), B = rep('B', 300000))
DT2 = data.frame(C = rep('C', 300000), D = rep('D', 300000))
library(data.table)
setDT(DT1)
setDT(DT2)
microbenchmark::microbenchmark(
cbind = {
dt1 <-copy(DT1)
dt2 <-copy(DT2)
result <- cbind(DT1, DT2)
},
update_join = {
dt1 <-copy(DT1)
dt2 <-copy(DT2)
dt1[, id := .I][ dt2[, id := .I], c("C", "D") := .(i.C, i.D), on = .(id)][, id := NULL]
} )
# Unit: milliseconds
# expr min lq mean median uq max neval
# cbind 1.8889 2.68405 9.454567 2.99505 3.62625 226.4432 100
# update_join 23.9186 24.67530 36.957518 25.62405 36.42760 249.3631 100
cbind()
仍然以压倒性优势获胜...
如果您想通过合并来尝试,只需将行名添加为列,然后进行合并:
DT1 = data.frame(A = rep('A', 3), B = rep('B', 3))
DT1$rowname = rownames(DT1)
DT2 = data.frame(C = rep('C', 3), D = rep('D', 3))
DT2$rowname = rownames(DT2)
DT3 = merge(DT1, DT2, by = 'rowname')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.