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
以下任务:
- 正确格式化变量(因素)
- 将“-999”定义为 NA
- 计算平均大小 > A
- 创建一些箱线图
问题:
如果我使用函数 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 并随后定义 NA
s。
summary(df)
命令还显示变量 x
.
的 -999:0
如果我首先定义 NA
s 并转换为因子,那么一切都按预期进行,我只绘制了定义的因子。
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
情况: 包含以下内容的 .csv 文件:
x,y,z
1,2,3
-999,2,4
2,-999,4
2,4,-999
以下任务:
- 正确格式化变量(因素)
- 将“-999”定义为 NA
- 计算平均大小 > A
- 创建一些箱线图
问题:
如果我使用函数 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 并随后定义 NA
s。
summary(df)
命令还显示变量 x
.
如果我首先定义 NA
s 并转换为因子,那么一切都按预期进行,我只绘制了定义的因子。
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