未能省略包含 NA 值的列:na.rm=TRUE 和 na.action=NULL

Posted

技术标签:

【中文标题】未能省略包含 NA 值的列:na.rm=TRUE 和 na.action=NULL【英文标题】:failed to omit Columns containing NA values with: na.rm=TRUE and na.action=NULL 【发布时间】:2019-09-07 03:15:42 【问题描述】:

我想获得与以下内容相同的输出:https://www.r-bloggers.com/how-to-aggregate-data-in-r/

我的输出是:

Group.1 Group.2 Name Role Shift Salary  Age
1    Cook  Dinner   NA   NA    NA   1800 25.0
2 Manager  Dinner   NA   NA    NA   2000 41.0
3  Server  Dinner   NA   NA    NA   1650 27.5
4    Cook   Lunch   NA   NA    NA   1200 24.0
5 Manager   Lunch   NA   NA    NA   2200 32.0
6  Server   Lunch   NA   NA    NA   1350 24.0

列包含NAs。包括"na.rm=TRUE""na.action=NULL" 没有任何区别。

我也不断收到警告:

警告信息: 1:在 mean.default(X[[i]], ...) 中: 参数不是数字或逻辑:返回 NA

如何修改aggregate(),使其省略不必要的列和\或NA 值,而不必求助于dplyr

谢谢

agg = aggregate(data,
                 by = list(data$Role, data$Shift),
                 FUN = mean, na.rm=TRUE, na.action=NULL)

【问题讨论】:

【参考方案1】:

让我们看看你的aggregate电话

aggregate(data, by = list(data$Role, data$Shift), FUN = mean)

在这里,您正在计算data所有 列中的平均值,data$Roledata$Shift(它们是您的分组变量)。

错误很明显,告诉您您正在尝试计算非数字条目的平均值。 data$Namedata$Roledata$Shift 都是非数字列。

我假设你在追求

aggregate(. ~ Role + Shift, data = data[, -1], FUN = mean)
#     Role  Shift Salary  Age
#1    Cook Dinner   1800 25.0
#2 Manager Dinner   2000 41.0
#3  Server Dinner   1650 27.5
#4    Cook  Lunch   1200 24.0
#5 Manager  Lunch   2200 32.0
#6  Server  Lunch   1350 24.0

这里的.(点)表示所有变量除了~(波浪号)RHS 上的变量。请注意我们如何排除 data$Name,将data[, -1] 作为data 参数传递给aggregate

或使用by 语法

aggregate(data[, c("Salary", "Age")], by = list(data$Role, data$Shift), FUN = "mean")

这里的x 参数指的是您要根据by 中定义的组聚合其值的所有列。


针对您的评论,仅按Role汇总

aggregate(cbind(Salary, Age) ~ Role, data = data[, -1], FUN = mean)
#    Role Salary   Age
#1    Cook   1500 24.50
#2 Manager   2100 36.50
#3  Server   1500 25.75 

【讨论】:

@RonakShah 同意,或者aggregate(cbind(Salary, Age)~Role + Shift,data, mean) 我得到的输出与该网站中的“> 数据”相同。 with: ```` > agg = aggregate(data, by = list(data$Role), FUN = mean) ```` 使用上面的代码,我也应该收到相同的输出,这将没有任何列与 NAs @analytics-josh 是的,以上分析基于相同的数据。 1 Cook 1500.0 24.5 2 Manager 2100.0 36.5 3 Server 1500.0 25.8 这是我所追求的输出(参考上面的链接) @analytics-josh 所以您只想按data$Role 聚合?为什么你在最初的尝试中包含data$Shift?无论哪种方式,我都进行了编辑,以向您展示如何通过 Role 聚合 SalaryAge

以上是关于未能省略包含 NA 值的列:na.rm=TRUE 和 na.action=NULL的主要内容,如果未能解决你的问题,请参考以下文章

按R的列和因子删除异常行

R语言-缺失值判断以及处理

如何过滤IQR低于特定值的矩阵的列?

替换大数据中的异常值

R 函数错误

R-描述性统计