r-在多个列上进行筛选时引入的NA值

  • 本文关键字:NA 筛选 r filter na
  • 更新时间 :
  • 英文 :


我有一个庞大复杂的数据集,需要仔细精简。在某些情况下,这意味着根据唯一的条件筛选单个记录。假设我有以下数据:

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))

比较"F"和NA时,条件检查nest.stat失败。

这里有一种混乱的、基本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