通过另一个数据帧增加数据帧错过的值

时间:2012-04-18 14:20:50

标签: r join merge

我有以下数据框:

> df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'))
> df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA))
> df1
  ind    x
1   1    a
2   2    b
3   3 <NA>
4   4    d
> df2
  ind    x
1   1 <NA>
2   2 <NA>
3   3    c
4   4 <NA>

我希望通过df2中的数值将它们组合在df1中填充缺失值。我怎样才能做到这一点?我既不能使用merge也不能使用join命令:

> merge(df1, df2, by='ind', all=T)
  ind  x.x  x.y
1   1    a <NA>
2   2    b <NA>
3   3 <NA>    c
4   4    d <NA>

3 个答案:

答案 0 :(得分:3)

构建测试用例的方式会产生因素,并且会给紧凑型解决方案带来额外的障碍,因为这些级别并不一致。您可以创建具有levels =其唯一值的并集的因子,或者最好使用字符向量:

df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'), stringsAsFactors=FALSE)
df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA), stringsAsFactors=FALSE)
df1[is.na(df1)] <- df2[is.na(df1)] # the key is same index on both sides
 df1
#---------
  ind x
1   1 a
2   2 b
3   3 c
4   4 d

可以说不太受欢迎的方法(但对于你不想重新处理的一对就地数据集可能更好)是:

 df1$x <- factor(df1$x, levels=union(levels(df1$x), levels(df2$x) ) )
 df2$x <- factor(df2$x, levels=union(levels(df1$x), levels(df2$x) ) )
 df1[is.na(df1)] <- df2[is.na(df1)]

答案 1 :(得分:1)

这个怎么样:

rbind(df1[complete.cases(df1),],df2[complete.cases(df2),])
  index x
1     1 a
2     2 b
3     3 c
4     4 d

答案 2 :(得分:1)

如果两个数据集中xNA,您会怎么做?这样做你想要的吗?

x <- merge(df1, df2, all = TRUE, by = "ind")
x <- transform(x, newcol = ifelse(is.na(x.x), as.character(x.y), as.character(x.x)))

> x
  ind  x.x  x.y newcol
1   1    a <NA>      a
2   2    b <NA>      b
3   3 <NA>    c      c
4   4    d <NA>      d