使用像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
。
有什么想法吗?
答案 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=""
来删除它们。