当通过某些条件对 data.frames 进行子集时,如果数据帧包含 NA,则可能会由于某个条件而获得 NA 值。然后它会在子集data.frame中出现问题:
# data generation
set.seed(123)
df <- data.frame(a = 1:100, b = sample(c("moon", "venus"), 100, replace = TRUE), c = sample(c('a', 'b', NA), 100, replace = TRUE))
# indexing
with(df, df[a < 30 & b == "moon" & c == "a",])
你得到:
a b c
NA NA <NA> <NA>
10 10 moon a
12 12 moon a
NA.1 NA <NA> <NA>
NA.2 NA <NA> <NA>
29 29 moon a
发生这种情况是因为条件导致向量包含 NA,然后这些 NA 将在索引数据帧时产生上述结果。
解决方案之一是以下修复之一:
with(df, df[a < 30 & b == "moon" & (c == "a" & !is.na(c)),]) # exclude NAs
with(df, df[a < 30 & b == "moon" & (c == "a" | is.na(c)),]) # include NAs
但这些非常笨拙 - 想象一下你有一个很长的条件
df[A == x1 & B == x2 & C == x3 & D == x4,]
,你必须像这样包装每个元素 - df[(A == x1 | is.na(A)) & (B == x2 | is.na(B)) ...,]
。
如果您只是尝试检查数据框,是否有任何优雅的解决方案不需要您在控制台上编写这些大量代码?