合并不相等的数据帧并用0替换缺失的行

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)

  • Hunh - 现在已经使用R一年了,我不知道你可以解决像这样的data.frame中的每个单元格.有时候质疑你的假设是值得的.谢谢大通! (3认同)
  • @jbest - 有参数`all.x`和`all.y`,其中`x` ==第一个data.frame对象,`y` ==第二个,正是这种情况.有关详细信息,请参阅"?merge"的帮助页面. (3认同)

Nic*_*bbe 7

或者,作为@ Chase代码的替代品,作为最近在数据库中具有背景的plyr粉丝:

require(plyr)
zz<-join(df1, df2, type="left")
zz[is.na(zz)] <- 0
Run Code Online (Sandbox Code Playgroud)