Как объединить столбцы двух data.tables? - PullRequest
1 голос
/ 08 ноября 2019

У меня есть две таблицы типа 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, но я работаю с большим количеством строк, поэтому я предпочитаю функцию, созданную для работы с большими таблицами данных.

Может кто-нибудь сказать мне, как это сделать?

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

Я пробовал кое-что с более легкой таблицей (используя код, предоставленный Хартом Радевым), и я 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это не моя чашка чая, но я думаю, что это может быть полезно, иметь решение с этим.

2 голосов
/ 08 ноября 2019

, основанный на ответе @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(), все еще выигрывающего оползнем ...

1 голос
/ 08 ноября 2019

Если вы хотите попробовать слияние, просто добавьте имена строк в виде столбца и выполните слияние:

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