使用 data.tables 链接多个 data.table::merge 操作

Pre*_*ost 3 merge r data.table

是否可以将多个合并操作一个接一个地链接起来data.tables

该功能类似于ata.frames在管道中连接多个 d,但以类似的链接方式dplyr使用,如合并下面的两个,然后根据需要进行操作。但只有您才能合并另一个. 我承认这里的这个问题可能非常相似,那是在 @chinsoon12 发表评论之后。data.tablesdata.tablesdata.tabledata.table

谢谢你的帮助!

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))
Run Code Online (Sandbox Code Playgroud)

Chr*_*ook 6

on可以链接带有参数的多个 data.table 连接。请注意,如果 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
Run Code Online (Sandbox Code Playgroud)

在连接之间添加新列的示例

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
Run Code Online (Sandbox Code Playgroud)

使用 和 magrittr 管道的示例merge

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
Run Code Online (Sandbox Code Playgroud)