合并NA替换

时间:2012-04-12 19:23:19

标签: r

我正在尝试在唯一ID和年份上合并两个数据框。在SQL语言中,我正在尝试执行左外连接,因此在合并中,all.x = TRUE。 y数据帧的某些元素不具有x DF中的所有值(唯一ID,年份组合)。在缺少匹配的情况下,我想合并具有与x数据帧中相同唯一ID的y数据帧中的行,但使用我在丢失的第一年之前的第一年。有关如何处理此合并的任何建议?非常感谢!

编辑想要更具体化

Dataframe x:

Id  year    var1 
1   2010    100
1   2011    105
1   2012    110
2   2010    100 
2   2011    105
2   2012    106

Dataframe y:

Id  year    var2    var3
1   2010    5       7
1   2011    10      8
2   2010    9       6

期望的合并:

Id  year    var1    var2    var3
1   2010    100     5       7
1   2011    105     10      8
1   2012    110     10      8
2   2010    100     9       6
2   2011    105     9       6
2   2012    106     9       6

2 个答案:

答案 0 :(得分:3)

我分两步完成:

> out <- merge(x, y, all.x=T)
> out
  Id year var1 var2 var3
1  1 2010  100    5    7
2  1 2011  105   10    8
3  1 2012  110   NA   NA
4  2 2010  100    9    6
5  2 2011  105   NA   NA
6  2 2012  106   NA   NA

然后使用na.locf包中的zoo

library(zoo)

> apply(out, 2, na.locf)
     Id year var1 var2 var3
[1,]  1 2010  100    5    7
[2,]  1 2011  105   10    8
[3,]  1 2012  110   10    8
[4,]  2 2010  100    9    6
[5,]  2 2011  105    9    6
[6,]  2 2012  106    9    6

这可以很容易地强制转换为data.frame。

> as.data.frame(apply(out, 2, na.locf))
  Id year var1 var2 var3
1  1 2010  100    5    7
2  1 2011  105   10    8
3  1 2012  110   10    8
4  2 2010  100    9    6
5  2 2011  105    9    6
6  2 2012  106    9    6

答案 1 :(得分:1)

这不会使用merge,而是一次遍历x行,以便在y中找到合适的匹配项。可能没有效率,但它确实有效。

do.call(rbind,
  lapply(seq(length=nrow(x)), function(r) {
    yid <- y[y$Id==x$Id[r],]
    yeardiff <- x$year[r] - yid$year
    yeardiff[yeardiff < 0] <- NA
    cbind(x[r,], yid[which.min(yeardiff),])
}))

结果是

  Id year var1 Id year var2 var3
1  1 2010  100  1 2010    5    7
2  1 2011  105  1 2011   10    8
3  1 2012  110  1 2011   10    8
4  2 2010  100  2 2010    9    6
5  2 2011  105  2 2010    9    6
6  2 2012  106  2 2010    9    6