Combining two dataframes keeping all columns
本问题已经有最佳答案,请猛点这里访问。
我要做的是组合2个数据帧,保留所有列(在下面的示例中没有这样做)和输入零,其中数据帧中存在不常见变量的间隙。
这似乎是一个PLYR或DPLYR主题。然而,PLYR中的完全联接并不能保留所有列,而左联接或右联接并不能保留我想要的所有行。查看dplyr作弊表(http://www.rstudio.com/wp content/uploads/2015/02/data wranging craitsheet.pdf),完整的连接似乎是我需要的功能,但r在成功加载包后无法识别此功能。
例如:
1 2 3 4 5 6 7 8 9 10 | col1 <- c("ab","bc","cd","de") col2 <- c(1,2,3,4) df1 <- as.data.frame(cbind(col1,col2)) col1 <- c("ab","ef","fg","gh") col3 <- c(5,6,7,8) df2 <- as.data.frame(cbind(col1,col3)) library(plyr) Example <- join(df1,df2,by ="col1", type ="full") #Does not keep col3 library(dplyr) Example <- full_join(df1,df2,by ="col1") #Function not recognised |
我想要输出…
1 2 3 4 5 6 7 8 | col1 col2 col3 ab 1 5 bc 2 0 cd 3 0 de 4 0 ef 0 6 fg 0 7 gh 0 8 |
号
解决方案
1 | Example <- merge(df1, df2, by ="col1", all = TRUE)` |
号
和
1 | Example <- join(df1,df2,by ="col1", type ="full") |
给出相同的结果,两个结果都带有一些NA:
1 2 3 4 5 6 7 8 9 | #> Example # col1 col2 col3 #1 ab 1 5 #2 bc 2 <NA> #3 cd 3 <NA> #4 de 4 <NA> #5 ef <NA> 6 #6 fg <NA> 7 #7 gh <NA> 8 |
。
用零替换这些条目的一种可能性是将数据帧转换为矩阵、更改条目并转换回数据帧:
1 2 3 4 5 6 7 8 9 10 11 12 | Example <- as.matrix(Example) Example[is.na(Example)] <- 0 Example <- as.data.frame(Example) #> Example # col1 col2 col3 #1 ab 1 5 #2 bc 2 0 #3 cd 3 0 #4 de 4 0 #5 ef 0 6 #6 fg 0 7 #7 gh 0 8 |
附言:我几乎可以肯定@akrun知道另一种在一行中实现这一目标的方法;)
跟随大卫阿伦伯格的评论…
1 | Example <- merge(df1, df2, by ="col1", all = TRUE) |