我试图在一个唯一的id和年份上合并两个数据帧。在SQL语言中,我试图做一个左外部联接,所以在合并中,就是all.x=TRUE。Y dataframe的某些元素在x中没有所有的值(唯一的id、年份组合)。在缺少匹配的情况下,我希望合并y数据帧中的行,该数据帧具有与x数据帧相同的唯一id,但使用的是我在缺少该数据帧之前的第一年。对于如何处理此合并有任何建议吗?非常感谢!
编辑想让它更具体
Dataframe x:
Id year var1
1 2010 100
1 2011 105
1 2012 110
2 2010 100
2 2011 105
2 2012 106Dataframe 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发布于 2012-04-12 19:57:59
我会分两步做:
> 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发布于 2012-04-12 20:10:40
这不使用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 6https://stackoverflow.com/questions/10130339
复制相似问题