我的数据中的观察结果包含在组中,我试图使用summarize_all函数为每个组获取多个汇总统计数据(例如,平均值、中位数、长度、均方差)。
问题是一些函数(例如,均值,中位数)需要na. rm=T参数,而另一些则不需要(例如,n())。当我在summarize_all中指定na.rm=T时,它会将na.rm参数应用于列出的每个函数(下面是均值和sd)。
library(dplyr)
airquality %>%
select(Month, Ozone, Solar.R, Temp) %>%
group_by(Month) %>%
summarize_all(list(mean, sd), na.rm=T)
但是,当我包含该函数时,它也将其应用于n(),这给了我错误:“错误:评估错误:未使用的参数(Ozone, na.rm=TRUE)”
airquality %>%
select(Month, Ozone, Solar.R, Temp) %>%
group_by(Month) %>%
summarize_all(list(mean, sd, n), na.rm=T)
我还想知道如何摆脱summarize_all在使用多个函数时创建的糟糕列名。例如,在第一段代码中,我得到了像这样的列名mpg_
正如我在你的问题的评论中提到的,我认为n()
导致了一个单独的问题:它期望函数有0个输入,所以我认为你不能在summarize_all中使用它。为了讨论na. rm
,让我们假设你想知道长度
airquality %>%
select(Month, Ozone, Solar.R, Temp) %>%
group_by(Month) %>%
summarize_all(list(mean,sd,length),na.rm=T)
错误。原始("长度")(臭氧,na. rm=TRUE):传递给“长度”的2个参数需要1
一种解决方案是手动指定您想要na. rm=T的每个函数,并将它们设为匿名函数:
airquality %>%
select(Month, Ozone, Solar.R, Temp) %>%
group_by(Month) %>%
summarize_all(list(mean = function(x) mean(x,na.rm=T), sd = function(x) sd(x,na.rm=T), length=length))
另请注意,完成后,列表中项目的名称会改变它在数据框中的显示方式。所以假设我们希望第一个被称为“酷”:
airquality %>%
select(Month, Ozone, Solar.R, Temp) %>%
group_by(Month) %>%
summarize_all(list(cool = function(x) mean(x,na.rm=T), sd = function(x) sd(x,na.rm=T), length=length))
# A tibble: 5 x 10
Month Ozone_cool Solar.R_cool Temp_cool Ozone_sd Solar.R_sd Temp_sd Ozone_length Solar.R_length Temp_length
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int> <int>
1 5 23.6 181. 65.5 22.2 115. 6.85 31 31 31
2 6 29.4 190. 79.1 18.2 92.9 6.60 30 30 30
3 7 59.1 216. 83.9 31.6 80.6 4.32 31 31 31
4 8 60.0 172. 84.0 39.7 76.8 6.59 31 31 31
5 9 31.4 167. 76.9 24.1 79.1 8.36 30 30 30