首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并NA替换

合并NA替换
EN

Stack Overflow用户
提问于 2012-04-12 19:23:18
回答 2查看 4.4K关注 0票数 1

我试图在一个唯一的id和年份上合并两个数据帧。在SQL语言中,我试图做一个左外部联接,所以在合并中,就是all.x=TRUE。Y dataframe的某些元素在x中没有所有的值(唯一的id、年份组合)。在缺少匹配的情况下,我希望合并y数据帧中的行,该数据帧具有与x数据帧相同的唯一id,但使用的是我在缺少该数据帧之前的第一年。对于如何处理此合并有任何建议吗?非常感谢!

编辑想让它更具体

Dataframe x:

代码语言:javascript
复制
Id  year    var1 
1   2010    100
1   2011    105
1   2012    110
2   2010    100 
2   2011    105
2   2012    106

Dataframe y:

代码语言:javascript
复制
Id  year    var2    var3
1   2010    5       7
1   2011    10      8
2   2010    9       6

想要的合并:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-12 19:57:59

我会分两步做:

代码语言:javascript
复制
> 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

代码语言:javascript
复制
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上。

代码语言:javascript
复制
> 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
票数 3
EN

Stack Overflow用户

发布于 2012-04-12 20:10:40

这不使用merge,而是一次循环遍历x的行,以在y中找到合适的匹配。可能效率不高,但有效。

代码语言:javascript
复制
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),])
}))

结果是

代码语言:javascript
复制
  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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10130339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档