高效的 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$two
在a$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
,这样就不需要mutate
和select
来获得所需的输出?即,有没有更有效的方法来获得我想要的东西?现在看来mutate
和select
都觉得很麻烦
【问题讨论】:
【参考方案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 和后续合并的主要内容,如果未能解决你的问题,请参考以下文章