Объединение нескольких операций data.table :: merge в data.tables - PullRequest
0 голосов
/ 20 сентября 2018

Возможно ли объединить несколько операций слияния одну за другой с помощью data.tables?

Функциональность будет аналогична объединению нескольких d ata.frames в трубу dplyr, но будет использоваться для data.tables в цепочке, аналогичной объединению двух data.tables в приведенном ниже, а затем манипулированию data.table, как требуется.Но только тогда вы сможете объединить еще одну data.table.Я признаю этот ТАК вопрос здесь может быть очень похожим, то есть после того, как @ chinsoon12 опубликовал комментарий.

Спасибо за любую помощь!

library(dplyr)
library(data.table)

# data.frame
df1 = data.frame(food = c("apples", "bananas", "carrots", "dates"),
                 quantity = c(1:4))

df2 = data.frame(food = c("apples", "bananas", "carrots", "dates"),
                 status = c("good", "bad", "rotten", "raw"))

df3 = data.frame(food = c("apples", "bananas", "carrots", "dates"),
                 rank = c("okay", "good", "better", "best"))

df4 = left_join(df1,
                df2,
                by = "food") %>% 
  mutate(new_col = NA) %>%  # this is just to hold a position of mutation in the data.frame
  left_join(.,
            df3,
            by = "food")



# data.table
dt1 = data.table(food = c("apples", "bananas", "carrots", "dates"),
                 quantity = c(1:4))

dt2 = data.table(food = c("apples", "bananas", "carrots", "dates"),
                 status = c("good", "bad", "rotten", "raw"))

dt3 = data.table(food = c("apples", "bananas", "carrots", "dates"),
                 rank = c("okay", "good", "better", "best"))

# this is what I am not sure how to implement
dt4 = merge(dt1,
            dt2,
            by = "food")[
              food == "apples"](merge(dt4))

1 Ответ

0 голосов
/ 20 сентября 2018

Можно объединить несколько соединений data.table с аргументом on.Обратите внимание, что без оператора обновления (": =") в j это было бы правым соединением, но с ": =" (т. Е. С добавлением столбцов) это становится левым внешним соединением.Полезный пост слева присоединяется здесь Соединение слева с использованием data.table .

Пример использования приведенного выше примера данных с подмножеством объединений:

dt4 <- dt1[dt2, on="food", `:=`(status = i.status)][
            food == "apples"][dt3, on="food", rank := i.rank]

##> dt4
## food quantity status rank
##1: apples        1   good okay

Пример добавления нового столбцамежду соединениями

dt4 <- dt1[dt2, on="food", `:=`(status = i.status)][
            , new_col := NA][dt3, on="food", rank := i.rank]

##> dt4
##      food quantity status new_col   rank
##1:  apples        1   good      NA   okay
##2: bananas        2    bad      NA   good
##3: carrots        3 rotten      NA better
##4:   dates        4    raw      NA   best

Пример использования merge и трубы magrittr:

dt4 <-  merge(dt1, dt2, by = "food") %>%
           set( , "new_col", NA) %>% 
             merge(dt3, by = "food")

##> dt4
##      food quantity status new_col   rank
##1:  apples        1   good      NA   okay
##2: bananas        2    bad      NA   good
##3: carrots        3 rotten      NA better
##4:   dates        4    raw      NA   best
...