使用逻辑选择时,为什么在新创建的data.frame中有NA?

时间:2015-12-09 23:34:31

标签: r dataframe

我试图摆脱R data.frame中的NAs。我试图创建一个新的df,其中只包含其群集为" texas"在这个例子中。

> newdf <- df[df$cluster == "texas",]
> summary(newdf$cluster)
     texas    oklahoma            NA's 
      510           0             719 

我找到other questions解决了NAs的问题,但在这种情况下,我只选择那些&#34; cluster&#34;列等于&#34;德克萨斯&#34; - NAs是怎么来的?

有没有更好的方法来做我想要的事情?

1 个答案:

答案 0 :(得分:3)

正如@MrFlick建议的那样,NA值会以略微(微妙?)不同的方式处理,具体取决于您的索引方式。

测试数据:

dd <- data.frame(cluster=c("oklahoma","texas",NA))
  1. 逻辑索引:索引向量中的TRUE值选择相应的值,FALSE删除它,NA结果为NA
  2. dd$cluster=="oklahoma"
    ## [1] TRUE FALSE NA
    summary(dd[dd$cluster=="oklahoma",])
    ## oklahoma    texas     NA's 
    ##        1        0        1 
    

    原则上,您可以使用dd$cluster=="oklahoma" & !is.na(dd$cluster)作为标准 - 因为FALSE & NAFALSE - 但这很尴尬。 (由于我们已经指定了单列数据框,而没有说drop=FALSE,因此在汇总之前将结果简化为向量。)

    1. 子集:虽然它是sometimes deprecated for non-interactive use,但subset具有便捷的属性,可以在标准评估为NA时删除值。 (另外,subset总是返回一个数据框,即使结果只有一列宽。)
    2. summary(subset(dd,cluster=="oklahoma"))
      ##      cluster 
      ##  oklahoma:1  
      ##  texas   :0  
      
      1. 其中
      2. which()仅返回TRUE值的索引,而非NA值:

        which(dd$cluster=="oklahoma")
        ## [1] 1
        summary(dd[which(dd$cluster=="oklahoma"),])
        ## oklahoma    texas 
        ##        1        0