R语言 如何合并两个数据表的列?

sbtkgmzw  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(311)

我有两个类型为data.table的表。我想将这两个表合并为一个表。它们看起来如下:
日期1:
第二天:

D  E  F
D  E  F
D  E  F

我想把它们组合起来:
我不知道如何通过合并来实现这一点,因为数据表没有公共的列名。
我知道cbind可以做到这一点,但是我使用的是大量的行,所以我更喜欢使用为处理大数据表而构建的函数。
有人能告诉我怎么做吗?

4ngedf3f

4ngedf3f1#

我已经尝试了一些稍大的表(使用由哈特Radev提供的代码),我已经microbenchmark ed他们,也许它可以有帮助:

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不是我喜欢的,但我想它可能会有帮助,有一个解决方案。

mklgxw1f

mklgxw1f2#

基于@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()仍然以压倒性优势获胜...

p5cysglq

p5cysglq3#

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

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

gywdnpxw4#

另一个选择是将DT2指定为DT1的列:

DT1[, colnames(DT2) := DT2]

它比cbind快得多。性能指标评测:

library(data.table)

DT1 <- data.table(A = sample(LETTERS, 1e6, 1), B = sample(1e6))
DT2 <- data.table(C = sample(LETTERS, 1e6, 1), D = sample(1e6))
DT <- copy(DT1)

microbenchmark::microbenchmark(cbind = cbind(DT1, DT2),
                               ":=" = DT1[, colnames(DT2) := DT2],
                               setup = {DT1 <- copy(DT)})
#> Unit: milliseconds
#>   expr    min      lq      mean   median       uq     max neval
#>  cbind 5.8867 6.56670 15.157835 11.15040 13.27365 80.9990   100
#>     := 4.6967 5.06075  8.011416  5.30005  5.92710 46.9052   100

相关问题