合并不相等的数据框并用0replace缺失的行

我有两个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) xy 1 a 0 2 b 1 3 c 0 

我想合并df1和df2。 字符a,b和c合并得很好,也有0,1,0但d和e没有任何内容。 我也想要d和e在合并表中,与0 0条件。 因此,对于df2 data.frame中的每个缺失行,必须将0放在df1表中,如:

  xy 1 a 0 2 b 1 3 c 0 4 d 0 5 e 0 

看看合并的帮助页面。 all参数让你指定不同types的合并。 这里我们要设置all = TRUE 。 这将使合并返回值不匹配的值,我们可以用is.na()更新为0:

 zz <- merge(df1, df2, all = TRUE) zz[is.na(zz)] <- 0 > zz xy 1 a 0 2 b 1 3 c 0 4 d 0 5 e 0 

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

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

data.table的另一种select。

示例数据

 dt1 <- data.table(df1) dt2 <- data.table(df2) setkey(dt1,x) setkey(dt2,x) 

 dt2[dt1,list(y=ifelse(is.na(y),0,y))] 

我使用了Chase给出的答案(回答于2011年5月11日14:21),但是我添加了一些代码来将该解决scheme应用于我的特定问题。

我有一个价格框架(用户,下载)和一个合计框架(用户,下载)将由用户合并,我想包括每一个费率,即使没有相应的总额。 但是,总数不会丢失,在这种情况下,selectNAreplace为零的行将失败。

第一行代码进行合并。 接下来的两行更改合并框架中的列名称。 if语句将NAreplace为零,但前提是存在NA的行。

 # merge rates and totals, replacing absent totals by zero graphdata <- merge(rates, totals, by=c("user"),all.x=T) colnames(graphdata)[colnames(graphdata)=="download.x"] = "download.rate" colnames(graphdata)[colnames(graphdata)=="download.y"] = "download.total" if(any(is.na(graphdata$download.total))) { graphdata[is.na(graphdata$download.total),]$download.total <- 0 }