我有两个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
我想合并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
5 回答
data.table的另一种替代方案 .
示例数据
码
看一下合并的帮助页面 .
all
参数允许您指定不同类型的合并 . 这里我们要设置all = TRUE
. 这将使合并返回NA
为不匹配的值,我们可以使用is.na()
更新为0:Updated many years later to address follow up question
您需要在第二个数据表中标识未合并的变量名称 - 我使用
setdiff()
. 请查看以下内容:由reprex包创建于2019-01-03(v0.2.1)
或者,作为@ Chase代码的替代品,作为最近在数据库中具有背景的plyr粉丝:
我使用了Chase给出的答案(于2011年5月11日14:21回答),但我添加了一些代码来将该解决方案应用于我的特定问题 .
我有一个费率框架(用户,下载)和用户合并的总框架(用户,下载),我想包括每个费率,即使没有相应的总数 . 但是,可能没有丢失的总数,在这种情况下,选择用于将NA替换为零的行将会失败 .
第一行代码执行合并 . 接下来的两行更改合并帧中的列名称 . if语句将NA替换为零,但仅当存在具有NA的行时 .
假设
df1
具有感兴趣的x
的所有值,您可以使用dplyr::left_join()
进行合并,然后使用base::replace()
或tidyr::replace_na()
将NA
替换为0
: