如何解决如何在 dplyr 中完全连接多个数据集ncol 不匹配
我有三个数据帧(d1、d2、d3),其中 ncol 和 nrow 跨数据集不匹配。
我想按公共列组合这些数据集,同时保留所有唯一的列和行。
我相信这意味着我需要一个完整的连接,我已经尝试使用下面的示例代码。
但是,当我尝试通过任何两个或多个数据集的公共键进行连接时,我收到一条错误消息:似乎 d2 和 d3 的公共列会引发错误,即使只有两个数据集共有的其他键是好的。
我应该如何加入这三个数据集?
d1 <- data.frame(Y = "Y1",N=1:3,C= c(1,3,2),D= c(3,1,4),E= c(0,1),Q= c(2,3))
d2 <- data.frame(Y = "Y2",H= c(3,S= c(2,2,0))
d3 <- data.frame(Y = "Y3",N=1:4,C= c(4,3),E= c(3,4,H= c(1,U= c(3,1))
join_all <- full_join(d1,d2,d3,by = c("Y","N","C","E","H"))
#Error: Join columns must be present in data.
#x Problem with `H`.
举个例子,这就是我想要的连接结果:
> desired_df <- data.frame(
+ Y= c("Y1","Y1","Y2","Y3","Y3"),+ N= c(1,+ C= c(1,"NA",+ D= c(3,"NA"),+ E= c(0,+ H= c("NA",+ Q= c(2,+ S= c("NA",+ U= c("NA",1))
> desired_df
Y N C D E H Q S U
1 Y1 1 1 3 0 NA 2 NA NA
2 Y1 2 3 1 1 NA 0 NA NA
3 Y1 3 2 4 1 NA 3 NA NA
4 Y2 1 NA NA 0 3 NA 2 NA
5 Y2 2 NA NA 1 1 NA 2 NA
6 Y2 3 NA NA 1 4 NA 0 NA
7 Y3 1 4 NA 3 1 NA NA 3
8 Y3 2 2 NA 1 3 NA NA 3
9 Y3 3 1 NA 4 2 NA NA 1
10 Y3 4 3 NA 2 1 NA NA 1
最后:一旦加入,我如何将 NA 变为 0?
感谢您的帮助!
解决方法
您可以将数据框放入列表中,执行连接并将 NA
替换为 0。
library(tidyverse)
lst(d1,d2,d3) %>% reduce(full_join) %>% replace(is.na(.),0)
# Y N C D E Q H S U
#1 Y1 1 1 3 0 2 0 0 0
#2 Y1 2 3 1 1 0 0 0 0
#3 Y1 3 2 4 1 3 0 0 0
#4 Y2 1 0 0 0 0 3 2 0
#5 Y2 2 0 0 1 0 1 2 0
#6 Y2 3 0 0 1 0 4 0 0
#7 Y3 1 4 0 3 0 1 0 3
#8 Y3 2 2 0 1 0 3 0 3
#9 Y3 3 1 0 4 0 2 0 1
#10 Y3 4 3 0 2 0 1 0 1
在基础 R 中:
result <- Reduce(function(x,y) merge(x,y,all = TRUE),list(d1,d3))
result[is.na(result)] <- 0
result
,
使用bind_rows
dplyr::bind_rows(d1,d3)
输出:
Y N C D E Q H S U
1 Y1 1 1 3 0 2 NA NA NA
2 Y1 2 3 1 1 0 NA NA NA
3 Y1 3 2 4 1 3 NA NA NA
4 Y2 1 NA NA 0 NA 3 2 NA
5 Y2 2 NA NA 1 NA 1 2 NA
6 Y2 3 NA NA 1 NA 4 0 NA
7 Y3 1 4 NA 3 NA 1 NA 3
8 Y3 2 2 NA 1 NA 3 NA 3
9 Y3 3 1 NA 4 NA 2 NA 1
10 Y3 4 3 NA 2 NA 1 NA 1
,
我们可以使用rbindlist
library(data.table)
rbindlist(list(d1,d3),fill = TRUE)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。