2016-09-06 71 views
3

我有列namex数据帧left,我想失踪x项与相应的name条目从数据帧right匹配:加入两个表,但填补公共列

left = data.frame(
    name = c("Bob", "Billy", "Roger", "Anna", "Kathy"), 
    x = c(NA, NA, NA, 4, 5) 
) 

# > left 
# name x 
# 1 Bob NA 
# 2 Billy NA 
# 3 Roger NA 
# 4 Anna 4 
# 5 Kathy 5 

right = data.frame(
    name = c("Bob", "Billy", "Roger"), 
    x = c(1, 2, 3) 
) 

# > right 
# name x 
# 1 Bob 1 
# 2 Billy 2 
# 3 Roger 3 

left_join给了我两列

> left_join(left, right, by="name") 
    name x.x x.y 
1 Bob NA 1 
2 Billy NA 2 
3 Roger NA 3 
4 Anna 4 NA 
5 Kathy 5 NA 

但我想要的是:

name x 
1 Bob  1 
2 Billy 2 
3 Roger 3 
4 Anna 4 
5 Kathy 5 

我可以使用连接命令吗?

回答

4
library(data.table) 

setDT(left)[right, on = 'name', x := i.x] 
left 
# name x 
#1: Bob 1 
#2: Billy 2 
#3: Roger 3 
#4: Anna 4 
#5: Kathy 5 
2

这里是一个可能的解决方案

> out <- na.omit(merge(left, right, by=c("name", "x"), all=TRUE)) 
> out[order(out$x),] # to get your same order 
    name x 
4 Bob 1 
2 Billy 2 
7 Roger 3 
1 Anna 4 
6 Kathy 5 
+1

(A次要的事情:)这取决于'right'能够填补所有'left'中的缺失值。 – Frank

3

另外一个

library(dplyr) 
left_join(left, right, "name") %>% 
    transmute(name, x=coalesce(x.x, x.y)) 
# name x 
# 1 Bob 1 
# 2 Billy 2 
# 3 Roger 3 
# 4 Anna 4 
# 5 Kathy 5 

via