R:在dplyr join

时间:2017-03-23 23:12:24

标签: r dplyr

使用像join这样的dplyr full_join函数时,具有相同名称的列会重复并给出后缀,例如" col.x"," col.y&# 34;," col.x.x"等,当它们不用于加入表时。

library(dplyr)
data1<-data.frame(
          Code=c(2,1,18,5), 
          Country=c("Canada", "USA", "Brazil", "Iran"), 
          x=c(50,29,40,29))
data2<-data.frame(
          Code=c(2,40,18),
          Country=c("Canada","Japan","Brazil"), 
          y=c(22,30,94))
data3<-data.frame(
          Code=c(25,14,52),
          Country=c("China","Japan","Australia"), 
          z=c(22,30,94))

data4<-Reduce(function(...) full_join(..., by="Code"), list(data1,data2,data3)) 

这导致&#34;国家&#34;,&#34; Country.x&#34;和&#34; Country.y&#34;列。

有没有办法将三列合并为一个,这样如果一行有一个&#34;国家&#34;的行,它取值来自&#34; Country.x&#34;或&#34; Country.y&#34;?

我尝试了基于this similar question的解决方案,但它给了我一个警告,只返回前三行的值。

 data4<-Reduce(function(...) full_join(..., by="Code"), list(data1,data2,data3)) %>%
        mutate(Country=coalesce(Country.x,Country.y,Country)) %>%
        select(-Country.x, -Country.y)

这会返回警告invalid factor level, NA generated

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用我的软件包safejoin,进行完全联接,并使用dplyr::coalesce处理冲突。

首先,我们必须将表重命名为具有相同名称的值列。

library(dplyr)
data1 <- rename_at(data1,3, ~"value")
data2 <- rename_at(data2,3, ~"value")
data3 <- rename_at(data3,3, ~"value")

然后我们可以加入

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
data1 %>%
  safe_full_join(data2, by = c("Code","Country"), conflict = coalesce) %>%
  safe_full_join(data3, by = c("Code","Country"), conflict = coalesce)
#   Code   Country value
# 1    2    Canada    50
# 2    1       USA    29
# 3   18    Brazil    40
# 4    5      Iran    29
# 5   40     Japan    30
# 6   25     China    22
# 7   14     Japan    30
# 8   52 Australia    94

您收到一些警告,因为您要连接不同级别的因子列,请添加参数check=""来删除它们。