【问题标题】:subsetting !is.na for multiple conditions unexpected results子集 !is.na 为多个条件意外结果
【发布时间】:2021-04-01 11:53:11
【问题描述】:

当 NA 出现在两个特定列中时,我正在尝试删除 df 中的行。

示例数据框

tmp <- data.frame(state = c(1,  1, 2,  2, 3, 3, 4, 5),
                  reg   = c(NA, 3, 6, NA, 9, 1, NA, 7),
                  gas   = c(NA, 5, NA, 9, 1, 3, NA, 1),
                  other = c(1, 2, 4, 2, 6, 8, 1, 1) )

从表格中您可以看到有两行“reg”和“gas”都是 NA

table(tmp$reg, tmp$gas, useNA = 'always')
       1 3 5 9 <NA>
  1    0 1 0 0    0
  3    0 0 1 0    0
  6    0 0 0 0    1
  7    1 0 0 0    0
  9    1 0 0 0    0
  <NA> 0 0 0 1    2

我想删除这些行但保留其他 NA 值。

我试过这段代码:

tmp[!is.na(tmp$reg & tmp$gas), ] 

但它会删除 reg 和 gas 中所有带有 NA 的行

  state reg gas other
2     1   3   5     2
5     3   9   1     6
6     3   1   3     8
8     5   7   1     1

这是我正在寻找的结果:

  state reg gas other
2     1   3   5     2
3     2   6  NA     4
4     2  NA   9     2
5     3   9   1     6
6     3   1   3     8
8     5   7   1     1

我也试过

tmp[which(!is.na(tmp$reg & tmp$gas)), ]  

但这会产生同样不想要的结果。

【问题讨论】:

  • 您应该使用 AND 运算符将它们视为单独的条件,例如(!is.na(tmp$gas) &amp; !is.na(tmp$reg))。这对你有用吗?
  • 这两个命令 tmp[which(!is.na(tmp$gas) &amp; !is.na(tmp$reg)),] tmp[(!is.na(tmp$gas) &amp; !is.na(tmp$reg)),] 产生与上述相同的不需要的结果

标签: r subset na


【解决方案1】:

我不知道为什么最初的方法不起作用,但我猜链接中有一些我看不到的错误。采取相反的方法(删除那些满足条件的)似乎会产生所需的输出。

tmp <- data.frame(state = c(1,  1, 2,  2, 3, 3, 4, 5),
                  reg   = c(NA, 3, 6, NA, 9, 1, NA, 7),
                  gas   = c(NA, 5, NA, 9, 1, 3, NA, 1),
                  other = c(1, 2, 4, 2, 6, 8, 1, 1) )

res = tmp[-which(is.na(tmp$reg) & is.na(tmp$gas)),]

res
#>   state reg gas other
#> 2     1   3   5     2
#> 3     2   6  NA     4
#> 4     2  NA   9     2
#> 5     3   9   1     6
#> 6     3   1   3     8
#> 8     5   7   1     1

由reprex package (v0.3.0) 于 2020 年 12 月 24 日创建

【讨论】:

  • 这是一个可报告的错误还是设计使然?
猜你喜欢
  • 2013-07-10
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
相关资源
最近更新 更多