gpt4 book ai didi

R:在 dplyr join 后合并重复的列

转载 作者:行者123 更新时间:2023-12-04 17:53:00 26 4
gpt4 key购买 nike

当您使用像 full_join 这样的 dplyr join 函数时,具有相同名称的列将被复制并赋予后缀,例如“col.x”、“col.y”、“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))

这会产生“Country”、“Country.x”和“Country.y”列。

有没有一种方法可以将三列合并为一列,这样如果某行的“国家/地区”不适用,它会从“国家/地区.x”或“国家/地区.y”中获取值?

我尝试了一个基于 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

有什么想法吗?

最佳答案

你可以使用我的包裹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="" 以删除它们。

关于R:在 dplyr join 后合并重复的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42988654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com