Lis*_*ann 61 merge r dataframe
我有两个data.frames,一个只有字符,另一个有字符和值.
df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e'))
df2 = data.frame(x=c('a', 'b', 'c'),y = c(0,1,0))
merge(df1, df2)
x y
1 a 0
2 b 1
3 c 0
Run Code Online (Sandbox Code Playgroud)
我想合并df1和df2.字符a,b和c合并良好,也有0,1,0但d和e什么都没有.我想d和e也在合并表中,0 0条件.因此,对于df2 data.frame中的每个缺失行,0必须放在df1表中,如:
x y
1 a 0
2 b 1
3 c 0
4 d 0
5 e 0
Run Code Online (Sandbox Code Playgroud)
Cha*_*ase 91
看一下合并的帮助页面.该all
参数允许您指定不同类型的合并.我们想在这里设置all = TRUE
.这将使合并返回NA
不匹配的值,我们可以使用以下命令更新为0 is.na()
:
zz <- merge(df1, df2, all = TRUE)
zz[is.na(zz)] <- 0
> zz
x y
1 a 0
2 b 1
3 c 0
4 d 0
5 e 0
Run Code Online (Sandbox Code Playgroud)
多年后更新以解决后续问题
您需要在第二个数据表中标识您未合并的变量名称 - 我用setdiff()
它.请查看以下内容:
df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e', NA))
df2 = data.frame(x=c('a', 'b', 'c'),y1 = c(0,1,0), y2 = c(0,1,0))
#merge as before
df3 <- merge(df1, df2, all = TRUE)
#columns in df2 not in df1
unique_df2_names <- setdiff(names(df2), names(df1))
df3[unique_df2_names][is.na(df3[, unique_df2_names])] <- 0
Run Code Online (Sandbox Code Playgroud)
由reprex包创建于2019-01-03 (v0.2.1)
或者,作为@ Chase代码的替代品,作为最近在数据库中具有背景的plyr粉丝:
require(plyr)
zz<-join(df1, df2, type="left")
zz[is.na(zz)] <- 0
Run Code Online (Sandbox Code Playgroud)