【问题标题】:Chaining multiple data.table::merge operations with data.tables使用 data.tables 链接多个 data.table::merge 操作
【发布时间】:2019-02-24 05:34:57
【问题描述】:

是否可以使用data.tables 一个接一个地链接多个合并操作?

该功能类似于在dplyr 管道中加入多个 data.frames,但将用于data.tables,其链接方式类似于在下面合并两个data.tables,然后操作data.table按要求。但是只有你才能合并另一个data.table。我承认this SO question here 可能非常相似,那是在@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))

【问题讨论】:

  • 你可以搜索Reduce(function(x, y) merge(x, y), list(dt2,dt3,dt4))
  • 您可能需要举一个更具体的例子。指导在这里,如果您有兴趣:stackoverflow.com/questions/5963269/… 只要逗号和括号平衡且在正确的位置,您在第二块中的伪代码对我来说看起来不错。
  • 你说得对,我认为这是一个更笼统的问题,但提供 MWE 会更容易。让我编辑提供一个。

标签: r merge data.table


【解决方案1】:

可以链接多个带有on 参数的data.table 连接。请注意,如果 j 中没有更新运算符(“:=”),这将是一个右连接,但是使用“:=”(即添加列),这将成为一个左外连接。左侧有用的帖子在这里加入Left join using 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

【讨论】:

  • 这听起来像是一个愚蠢的问题,但是i.statusi.rank 前面的i. 是什么意思?
  • 这是一个很好的问题,事后看来,这里可能不需要。在x[i] 形式的连接中,它可用于指定该列取自i(右)表。同样,您可以使用x.name 之类的内容从x(左)表中指定。但是,事后看来,这可能仅在非 equi 连接中有用(需要?)(请参阅此stackoverflow.com/questions/44282044/… 的公认答案)。
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2012-12-17
相关资源
最近更新 更多