如何使用包含NA作为级别的因子过滤data.frame

Rob*_*ert 5 filtering r dataframe

如果您的data.frame因素不包含NAs作为级别,则可以毫无问题地过滤数据.

set.seed(123)
df=data.frame(a = factor(as.character(c(1, 1, 2, 2, 3, NA,3,NA)),exclude=NULL),
           b= runif(8))
#str(df)
df[df$a==3,]
#      a         b
#    5 3 0.9404673
#    7 3 0.5281055
Run Code Online (Sandbox Code Playgroud)

如果您需要按NA级别进行过滤,则会出现问题.以下不起作用:

df[df$a==NA,]
df[df$a=="NA",]
df[is.na(df$a),]
Run Code Online (Sandbox Code Playgroud)

我发现的唯一方法是将因子转换为数字并将其与级别数进行比较.

df[as.numeric(df$a)==4,]
#     a         b
#6 <NA> 0.0455565
#8 <NA> 0.8924190
Run Code Online (Sandbox Code Playgroud)

有没有其他更直观/更优雅的方法来获得相同的结果?

Ott*_*met 5

检查对应的级别df$a是否为na:

df[is.na(levels(df$a)[df$a]),]
     a         b
6 <NA> 0.1649003
8 <NA> 0.6556045
Run Code Online (Sandbox Code Playgroud)

正如弗兰克指出的那样,这也包括观察的价值df$a,而不仅仅是它的水平NA.我想原始海报想要包括这些案例.如果没有,可以做类似的事情

x <- factor(c("A","B", NA), levels=c("A", NA), exclude = NULL)
i <- which(is.na(levels(x)[x]))
i[!is.na(x[i])]
Run Code Online (Sandbox Code Playgroud)

给你3,只有NA-level,留下未知的水平(B).