【问题标题】:square brackets subsetting gives NAs方括号子集给出 NA
【发布时间】:2013-02-14 20:24:26
【问题描述】:

我正在对状态数据框进行子集化。我想要列子区域中“吐出”的行。但它给了我所有的 NA。我哪里错了?

我最终想添加另一个这样的列

states$code[states$subregion=="spit"]="Priority1"

示例代码:

states=map_data("state")
states[states$subregion=="spit",]
# long lat group order region subregion
# NA     NA  NA    NA    NA   <NA>      <NA>
# NA.1   NA  NA    NA    NA   <NA>      <NA>
# NA.2   NA  NA    NA    NA   <NA>      <NA>
# NA.3   NA  NA    NA    NA   <NA>      <NA>
# NA.4   NA  NA    NA    NA   <NA>      <NA>
# NA.5   NA  NA    NA    NA   <NA>      <NA>

但这给了我正确的结果states[states$region=="north carolina",]

【问题讨论】:

    标签: r subset states


    【解决方案1】:

    看一下states的结构,特别注意subregion中有NA的值。如果您像正在做的那样使用方括号进行子集化,NA包含 在子集中。一个小例子:

    dat <- data.frame(x=1:10, y=c('a', 'b'), z='foo')
    dat$y[9:10] <- NA
    
    dat[dat$y == 'a',]
    
          x    y    z
    1     1    a  foo
    3     3    a  foo
    5     5    a  foo
    7     7    a  foo
    NA   NA <NA> <NA>
    NA.1 NA <NA> <NA>
    

    如果你使用na.omit 或类似的东西,你会看到你期望的结果:

    foo <- states[states$subregion=="spit",]
    foo[!is.na(foo$subregion),]
    
    #            long      lat group order         region subregion
    # 10321 -76.00285 36.55471    40 10321 north carolina      spit
    # 10322 -75.93983 36.55471    40 10322 north carolina      spit
    # 10323 -75.92837 36.54898    40 10323 north carolina      spit
    # 10324 -75.91691 36.52606    40 10324 north carolina      spit
    # 10325 -75.91118 36.50887    40 10325 north carolina      spit
    # 10326 -75.91118 36.49168    40 10326 north carolina      spit
    # 10327 -75.93983 36.49168    40 10327 north carolina      spit
    # 10328 -75.96848 36.49741    40 10328 north carolina      spit
    # 10329 -75.97421 36.50314    40 10329 north carolina      spit
    # 10330 -75.97421 36.52606    40 10330 north carolina      spit
    # 10331 -75.98566 36.55471    40 10331 north carolina      spit
    # 10332 -76.00285 36.55471    40 10332 north carolina      spit
    

    或者在一行中:

    states[states$subregion == 'spit' & !is.na(states$subregion),]
    

    【讨论】:

    • long lat group order region subregion 2391 -81.29125 31.41528 10 2391 georgia &lt;NA&gt; 6081 -70.10712 42.02073 21 6081 massachusetts main 13460 -73.41881 44.13494 52 13460 vermont &lt;NA&gt; 如果我使用 na.omit,我会得到类似的结果
    • 查看我的编辑。相反,子集通常不会在subregion 中显示带有NA 的行。
    • 我之前的na.omit 评论是错误的。不过,这确实有效:states[which(states$subregion == "spit"),]。从逻辑索引切换到索引索引会绕过NA's。
    • @BrianDiggs 正确!我也对此有所了解。但是,我不喜欢与我的编辑相比的语法差异。它的代码更多,但更清楚的是我也处理了NA 值。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多