dplyr summarise_each with na.rm

86
有没有一种方法可以指示 `dplyr` 在使用 `summarise_each` 时带上 `na.rm=TRUE` 参数? 我想对变量取平均值,使用 `summarise_each("mean")`,但不知道如何指定忽略缺失值。
6个回答

118

根据文档中的链接,似乎可以使用funs(mean(., na.rm = TRUE))

library(dplyr)
by_species <- iris %>% group_by(Species)
by_species %>% summarise_each(funs(mean(., na.rm = TRUE)))

12
几年后的一条评论:summarise_each()已被弃用。 在summarise_all中,你可以在funs参数后添加na.rm = TRUE -当你想调用多个函数时很有用,例如:iris %>% group_by(Species) %>% summarise_all(funs(mean, max, sd), na.rm = TRUE) - tjebo

32

更新

当前的dplyr版本强烈建议使用across代替更具体的函数summarise_all等。

将在命名列表中命名函数的以下语法转换为across可能如下所示:

library(dplyr)
ggplot2::msleep %>% 
  select(vore, sleep_total, sleep_rem) %>%
  group_by(vore) %>%
  summarise(across(everything(), .f = list(mean = mean, max = max, sd = sd), na.rm = TRUE))

#> # A tibble: 5 x 7
#>   vore  sleep_total_mean sleep_total_max sleep_total_sd sleep_rem_mean
#>   <chr>            <dbl>           <dbl>          <dbl>          <dbl>
#> 1 carni            10.4             19.4           4.67           2.29
#> 2 herbi             9.51            16.6           4.88           1.37
#> 3 inse~            14.9             19.9           5.92           3.52
#> 4 omni             10.9             18             2.95           1.96
#> 5 <NA>             10.2             13.7           3.00           1.88
#> # ... with 2 more variables: sleep_rem_max <dbl>, sleep_rem_sd <dbl>


旧回答

summarise_each现在已经被弃用,这里提供了一个使用summarise_all的选项。

  • 人们可以仍然在funs参数中指定na.rm = TRUE(参见@flodel的回答:只需将summarise_each替换为summarise_all即可)。
  • 但是您也可以在funs参数后面添加na.rm = TRUE

当你想调用不止一个函数时,这很有用,例如:

编辑

由于评论@Mikko的建议,funs()参数现在已经被(软件)弃用。可以使用警告提供的建议,在代码下面看到。 na.rm仍然可以在summarise_all中作为附加参数指定。

我使用ggplot2::msleep因为它包含NAs并且更好地显示了这一点。

library(dplyr)

ggplot2::msleep %>% 
  select(vore, sleep_total, sleep_rem) %>%
  group_by(vore) %>%
  summarise_all(funs(mean, max, sd), na.rm = TRUE)
#> Warning: funs() is soft deprecated as of dplyr 0.8.0
#> Please use a list of either functions or lambdas: 
#> 
#>   # Simple named list: 
#>   list(mean = mean, median = median)
#> 
#>   # Auto named with `tibble::lst()`: 
#>   tibble::lst(mean, median)
#> 
#>   # Using lambdas
#>   list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))


3
“funs”已经被弃用,当前命令为“list(...)”。请注意更新。 - Mikko
5
为了完整起见,例如使用list(...): summarise_all(list( minimum = ~ min(., na.rm = TRUE), maximum = ~ max(., na.rm = TRUE), s_dev = ~ sd(., na.rm = TRUE))) - jclouse

2
例如,考虑mtcars数据集。
library(dplyr)

您始终可以使用summarise来避免冗长的语法:

mtcars %>%
  group_by(cyl) %>% 
  summarise(mean_mpg = mean(mpg, na.rm=T),
            sd_mpg = sd(mpg, na.rm = T))

2
dplyr中,summarise_at函数将在特定列上对数据集进行汇总,并允许删除每个应用函数的NAs。以鸢尾花数据集为例,计算从萼片长度到花瓣宽度变量的平均值和中位数。
library(dplyr)
summarise_at(iris,vars(Sepal.Length:Petal.Width),funs(mean,median),na.rm=T)


1
我不知道我的回答是否会对之前的评论有所补充,但希望是肯定的。
在我的情况下,我有一个实验的数据库,包含两组(控制组和实验组),特定变量(日期)具有不同的水平,我想得到另一个变量(重量)在每个组的特定日期水平上的平均值和标准差的总结。
这是我的数据库示例:
animal    group           day       weight      
1.1       "control"       73        NA   
1.2       "control"       73        NA   
3.1       "control"       73        NA   
9.2       "control"       73        25.2  
9.3       "control"       73        23.4  
9.4       "control"       73        25.8   
2.1       "exp"           73        NA       
2.2       "exp"           73        NA     
10.1      "exp"           73        24.4     
10.2      "exp"           73        NA     
10.3      "exp"           73        24.6
所以,例如在这种情况下,我想要得到每个组(控制组,实验组)第73天体重的平均值和标准差,省略NA值。
我使用以下命令完成此操作:
data[data$day=="73",] %>% group_by(group) %>% summarise(mean(weight[group == "exp"], na.rm=T),sd(weight[group == "exp"], na.rm=T))
data[data$day=="73",] %>% group_by(group) %>% summarise(mean(weight[group == "control"], na.rm=T),sd(weight[group == "control"], na.rm=T))

-1

这也可能有所帮助!summarize_at(c("voltage","current"), funs(min,max), na.rm =TRUE)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接