高效的 left_join 和后续合并

Posted

技术标签:

【中文标题】高效的 left_join 和后续合并【英文标题】:Efficient left_join and subsequent merge 【发布时间】:2017-07-20 14:21:58 【问题描述】:

我有以下数据:

library(dplyr)

a<-data.frame("one"=c(1:10),
              "two"=c("","","","","a","a","a","a","a","a"), stringsAsFactors = F)

b<-data.frame("one"=c(4,2,6),
              "two"=c("C","D","A"), stringsAsFactors = F)

我想将left_join b 放到a 上,这样a$twoa$one == b$one 时得到b$two 的值。我喜欢这样:

left_join(a, b, by="one")

为了拥有和之前一样的结构,我们可以这样做

left_join(a, b, by="one") %>% 
  mutate(two=ifelse(is.na(two.y), two.x, two.y)) %>% 
  select(-c(two.x, two.y))

这给了我想要的输出:

   one two
1    1    
2    2   D
3    3    
4    4   C
5    5   a
6    6   A
7    7   a
8    8   a
9    9   a
10  10   a

有没有办法执行left_join,这样就不需要mutateselect 来获得所需的输出?即,有没有更有效的方法来获得我想要的东西?现在看来mutateselect都觉得很麻烦

【问题讨论】:

【参考方案1】:

如果我们正在寻找一个紧凑且高效的选项,那么这可以通过data.table 来实现。将'a'转换为data.table后,加入on'one'并分配(:=)'i.two',即从'b'到'two'的列(来自'a')

library(data.table)
setDT(a)[b,two := i.two , on = .(one)]
a
#     one two
# 1:   1    
# 2:   2   D
# 3:   3    
# 4:   4   C
# 5:   5   a
# 6:   6   A
# 7:   7   a
# 8:   8   a
# 9:   9   a
#10:  10   a

【讨论】:

谢谢。这是对数据执行的常见操作,我很惊讶dplyr 不支持更紧凑和简洁的方式来实现这一点

以上是关于高效的 left_join 和后续合并的主要内容,如果未能解决你的问题,请参考以下文章

高效合并交错索引数据

高效的 SQL 表合并和分页

将列从一个数据帧合并到另一个数据帧(left_join不起作用) - rstudio

合并两个 DAG 的高效算法

一个高效的BootLoader与APP固件合并方法

如何在 Spark Scala 高效的全外连接中合并连接多个 DataFrame