2016-08-23 18 views
3

我想加入两个数据框。某些列名称重叠,并且其中一个数据框的重叠列中有NA条目。下面是一个简单的例子:使用dplyr连接两个数据帧时,我可以替换NAs吗?

df1 <- data.frame(fruit = c('apples','oranges','bananas','grapes'), var1 = c(1,2,3,4), var2 = c(3,NA,6,NA), stringsAsFactors = FALSE) 
df2 <- data.frame(fruit = c('oranges','grapes'), var2=c(5,6), var3=c(7,8), stringsAsFactors = FALSE) 

我能否使用dplyr加入功能加入这些数据帧,并自动优先考虑非NA项,使我得到了“VAR2”列有在加入数据没有NA项帧?现在,如果我拨打left_join,它会保留NA条目,并且如果我拨打full_join它会复制行。

回答

8

​​3210可能是你需要的东西。它与从第二矢量值的第一载体填充NA在相应的位置:

library(dplyr) 
df1 %>% 
     left_join(df2, by = "fruit") %>% 
     mutate(var2 = coalesce(var2.x, var2.y)) %>% 
     select(-var2.x, -var2.y) 

#  fruit var1 var3 var2 
# 1 apples 1 NA 3 
# 2 oranges 2 7 5 
# 3 bananas 3 NA 6 
# 4 grapes 4 8 6 

或者使用data.table,这并就地更换:

library(data.table) 
setDT(df1)[setDT(df2), on = "fruit", `:=` (var2 = i.var2, var3 = i.var3)] 
df1 
#  fruit var1 var2 var3 
# 1: apples 1 3 NA 
# 2: oranges 2 5 7 
# 3: bananas 3 6 NA 
# 4: grapes 4 6 8 
+0

感谢您的回答!对于dplyr解决方案,如果存在多个重叠列,mutate步骤是否可以使用x和y合并所有具有相同名称的列? – qdread

+0

没有对列进行硬编码的更一般的方法可能会在合并后重塑您的数据。这里是一个例子'df1%>%left_join(df2,by =“fruit”)%>%reshape(vary = 3:4,dir =“long”)%>%group_by(fruit,var1,var3)%>%我可以提供的summarise_each(funs(na.omit(。)),-id,-time)。 – Psidom

0

与dplyr沿purrr使用可能解决方案适用于多列:

library(purrr) 
library(dplyr) 

df<-left_join(df1,df2,by="fruit") 
map2_dfr(df[3],df[4],~ifelse(is.na(.x),.y,.x)) %>% 
bind_cols(df[c(1,2,5)],.) 

    fruit var1 var3 var2.x 
1 apples 1 NA  3 
2 oranges 2 7  5 
3 bananas 3 NA  6 
4 grapes 4 8  6 
相关问题