【问题标题】:How can I pass NA when attempt to select fails with "attempted to select less than one element"?当尝试选择失败并显示“尝试选择少于一个元素”时,如何通过 NA?
【发布时间】:2014-11-10 09:03:45
【问题描述】:

我有两个数据框,a 和 b,都有一个“州”和“年”列(以及其他列)。我正在尝试将 VARX 的值从 b 转移到 a。我用这个:

for(i in seq_along(a)) {a$VARX[[i]]<-b$VARX[[which(b$state==a$state[[i]] & b$year==a$year[[i]])]]}

我收到此错误:

b$VARX[[which(b$state == a$state[[i]] &amp; b$year == 中的错误: 尝试选择少于一个元素

问题似乎是a中有一些行在b中没有对应的行,所以它无法选择一个元素。在这些情况下,我如何返回 NA(所以 a$VARX[i]=NA),或者从 b 中没有相应行的所有情况中清除 a?

【问题讨论】:

  • 一个可重现的例子会有所帮助。也许使用 dput() 将您的数据添加到问题中。据我所知,您想用b 中的相应记录覆盖a$VARX 中的值,这些记录由两个数据帧之间的stateyear 匹配确定。如果是这样,使用merge()data.table 包可能会提供更简单的解决方案。

标签: r for-loop


【解决方案1】:

循环不是一个好的选择。请参阅此工作示例:

a=data.frame(state=c("a","b","a"),year=c("2012","2013","2014"),VARX=c(1,2,3))

###################
  state year VARX
1     a 2012    1
2     b 2013    2
3     a 2014    3
###################

b=data.frame(state=c("a","b","c"),year=c("2012","2013","2014"),VARX=c(4,5,6))

###################
  state year VARX
1     a 2012    4
2     b 2013    5
3     c 2014    6
###################

# merge a and b
c=merge(a,b,by=c("state","year"),all.x=T,sort =F,suffixes = c(".a",""))

###################
  state year VARX.a VARX
1     a 2012      1    4
2     b 2013      2    5
3     a 2014      3   NA
###################

# drop VARX in data frame a
subset(c,select=-VARX.a)

###################
  state year VARX
1     a 2012    4
2     b 2013    5
3     a 2014   NA
###################

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2016-01-24
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多