我正在尝试在唯一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
答案 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