R:箱线图包括 -999 定义为 NA -> 取决于因子声明和 NA 声明的顺序

R: boxplots include -999 which were defined as NA -> dependent on order of factor declaration and NA declaration

情况: 包含以下内容的 .csv 文件:

x,y,z
1,2,3
-999,2,4
2,-999,4
2,4,-999

以下任务:

  1. 正确格式化变量(因素)
  2. 将“-999”定义为 NA
  3. 计算平均大小 > A
  4. 创建一些箱线图

问题: 如果我使用函数 replace_with_na_all (https://cran.r-project.org/web/packages/naniar/vignettes/replace-with-na.html) 计算平均大小会抛出这个错误:

Argument is not numeric nor boolean: return NA

虽然箱线图看起来不错。

如果我使用集成的 NA 声明 df[df == -999] <- NA,则平均值的计算效果很好。 但是箱线图将显示一个图表,其中仅包含变量“x”的“-999”,如果我首先正确格式化变量 as.factor 并随后定义 NAs。 summary(df) 命令还显示变量 x.

的 -999:0

如果我首先定义 NAs 并转换为因子,那么一切都按预期进行,我只绘制了定义的因子。 summary(df) 函数不会为变量显示 -999。

这些问题不会发生在我定义为因子的其他变量上。

代码示例:

df <- read.csv("C:/Users/Jeremias/Desktop/test.csv")
df[df == -999] <- NA
f$x <- as.factor(df$x) 
mean(df[df$y > 1,"y"],na.rm = T)
boxplot(data = df, df$y ~ df$x, outline = F)

我花了几个小时才找到解决方案(正确的顺序),我想了解原因。

也许一些更有经验的用户对此行为有解释,如果这只是 R 特定的或其他什么。

正如您已经正确得出的结论,它取决于(正确的)顺序。一旦您将 UrbanTrail$Geschlecht 定义为因子,其级别将被保存为变量的属性,如图所示:

UrbanTrail <- data.frame(Geschlecht = c(1,2,2,1,1,2,1,1,2,-999), 
                         Wohungsgroesse = 61:70)

UrbanTrail$Geschlecht <- as.factor(UrbanTrail$Geschlecht)

attr(UrbanTrail$Geschlecht, "levels") # Attributes: levels "-999", "1", "2" 

UrbanTrail[UrbanTrail$Geschlecht == -999, "Geschlecht"] <- NA  # Even though "-999" becomes 'NA ...

attr(UrbanTrail$Geschlecht, "levels")                           # ... attributes remain the same: levels "-999", "1", "2" 

-999 变为 NA 后,其级别不会相应调整。 如果你制作箱线图,箱线图将寻找水平(就像我们在这个例子中所做的那样)并找到“-999”、“1”和“2”并将它们用作类别,因为水平在 - 999 变成 NA.

可能replace_with_na之后会自动修改变量的水平

来自莱比锡的问候

克里斯

P.S.:

我强烈推荐阅读“R for Data Science” https://r4ds.had.co.nz/factors.html