我有两个类型为data.table的表。我想将这两个表合并为一个表。它们看起来如下:日期1:第二天:
D E F D E F D E F
我想把它们组合起来:我不知道如何通过合并来实现这一点,因为数据表没有公共的列名。我知道cbind可以做到这一点,但是我使用的是大量的行,所以我更喜欢使用为处理大数据表而构建的函数。有人能告诉我怎么做吗?
4ngedf3f1#
我已经尝试了一些稍大的表(使用由哈特Radev提供的代码),我已经microbenchmark ed他们,也许它可以有帮助:
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不是我喜欢的,但我想它可能会有帮助,有一个解决方案。
data.table
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()仍然以压倒性优势获胜...
cbind()
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')
gywdnpxw4#
另一个选择是将DT2指定为DT1的列:
DT2
DT1
DT1[, colnames(DT2) := DT2]
它比cbind快得多。性能指标评测:
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
4条答案
按热度按时间4ngedf3f1#
我已经尝试了一些稍大的表(使用由哈特Radev提供的代码),我已经
microbenchmark
ed他们,也许它可以有帮助:data.table
不是我喜欢的,但我想它可能会有帮助,有一个解决方案。mklgxw1f2#
基于@s_t答案,下面是使用
data.table
的更新连接的基准测试cbind()
仍然以压倒性优势获胜...p5cysglq3#
如果您想尝试合并,只需将行名添加为列,然后进行合并:
gywdnpxw4#
另一个选择是将
DT2
指定为DT1
的列:它比
cbind
快得多。性能指标评测: