过滤多列时引入的 NA 值
NA values introduced when I filter on multiple columns
我有一个庞大的复杂数据集,需要仔细削减。在某些情况下,这意味着根据唯一标准过滤单个记录。假设我有以下数据:
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),]
但是 returns
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 失败。
这是一种凌乱的 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
我有一个庞大的复杂数据集,需要仔细削减。在某些情况下,这意味着根据唯一标准过滤单个记录。假设我有以下数据:
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),]
但是 returns
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 失败。
这是一种凌乱的 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