【问题标题】:NA values introduced when I filter on multiple columns当我过滤多列时引入的 NA 值
【发布时间】:2019-06-06 21:04:57
【问题描述】:

我有一个大型复杂数据集,需要仔细削减。在某些情况下,这意味着根据唯一标准过滤单个记录。假设我有以下数据:

       locname mo dy   yr nest.stat daynight
1 CARACO CREEK  3  9 1994         U        D
2 CARACO CREEK  4  4 1994      <NA>        D
3 CARACO CREEK  4 14 1994      <NA>        N
4 CARACO CREEK  5  5 1994      <NA>        D
5 CARACO CREEK  5 17 1994      <NA>        N
6 CARACO CREEK  6 29 1994      <NA>        N
7 CARACO CREEK  8  2 1994         F        D

我需要删除第七条记录,它在 locname_yr_nest.stat 的数据集中是唯一的(我不能只说 df[-7,],因为位置可以在新数据迭代中改变)。

我试过了

df[!(df$locname=="CARACO CREEK" & df$nest.stat=="F" & df$yr==1994),]

但是返回

          locname mo dy   yr nest.stat daynight
1    CARACO CREEK  3  9 1994         U        D
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>

如果我只过滤两列(例如 locname 和 yr),它可以正常工作。这就是我如何从较大的集合中创建这个较小的集合,显示所有 1994 年的记录。但是,添加第三列会将其丢弃。作为补充说明,这种精确方法适用于不同列的不同数据集。

为简单起见,这里是示例集:

df <- structure(list(locname = c("CARACO CREEK", "CARACO CREEK", "CARACO CREEK", 
"CARACO CREEK", "CARACO CREEK", "CARACO CREEK", "CARACO CREEK"
), mo = c(3, 4, 4, 5, 5, 6, 8), dy = c(9, 4, 14, 5, 17, 29, 2
), yr = c(1994, 1994, 1994, 1994, 1994, 1994, 1994), nest.stat = c("U", 
NA, NA, NA, NA, NA, "F"), daynight = c("D", "D", "N", "D", "N", 
"N", "D")), class = "data.frame", row.names = c(NA, 7L))

【问题讨论】:

标签: r filter na


【解决方案1】:

在比较“F”和 NA 时,您的条件检查 nest.stat 失败。

这是一种凌乱的 base-R 方式:

df[!(df$locname == "CARACO CREEK" & 
     ifelse(!is.na(df$nest.stat),df$nest.stat == "F",FALSE) &
      df$yr == 1994),]

输出:

   locname mo dy   yr nest.stat daynight
1 CARACO CREEK  3  9 1994         U        D
2 CARACO CREEK  4  4 1994      <NA>        D
3 CARACO CREEK  4 14 1994      <NA>        N
4 CARACO CREEK  5  5 1994      <NA>        D
5 CARACO CREEK  5 17 1994      <NA>        N
6 CARACO CREEK  6 29 1994      <NA>        N

【讨论】:

  • 谢谢!我不太明白 ifelse 调用中的逻辑,但它确实有效,我稍后会弄明白!
  • ifelse 的语法是:ifelse(条件语句,TRUE 结果,FALSE 结果)。所以在这种情况下,如果nest.stat不是NA,那么检查是否nest.stat == "F",否则就返回FALSE
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多