如何合并两个data.tables的列?

问题描述 投票:0回答:2

我有两个类型为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是可行的,但是我正在处理很多行,因此我更喜欢为大数据表而构建的函数。

谁能告诉我该怎么做?

r merge data.table
2个回答
1
投票

如果要通过合并进行尝试,只需将行名添加为列,然后进行合并:

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')

0
投票

我已经尝试了一些稍微大一点的表(使用Hart Radev提供的代码),并且我已经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(
cbinddataframe = {cbind.data.frame(DT1, DT2)},
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
 cbinddataframe      40.534      49.4935 8.215106e+01      59.9470     106.4540     348.161   100
      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

因此cbind.data.frame似乎是该表中最快的,也许有人可以指出原因。

data.table不是我的杯茶,但我想有一个解决方案可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.