1

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

编辑想让它更具体

数据框 x:

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

数据框 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
4

2 回答 2

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.locfzoo包中使用:

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
于 2012-04-12T19:57:59.503 回答
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
于 2012-04-12T20:10:40.760 回答