有没有一种方法可以指示 `dplyr` 在使用 `summarise_each` 时带上 `na.rm=TRUE` 参数? 我想对变量取平均值,使用 `summarise_each("mean")`,但不知道如何指定忽略缺失值。
根据文档中的链接,似乎可以使用funs(mean(., na.rm = TRUE))
:
library(dplyr)
by_species <- iris %>% group_by(Species)
by_species %>% summarise_each(funs(mean(., na.rm = TRUE)))
更新
当前的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))
summarise_all(list( minimum = ~ min(., na.rm = TRUE), maximum = ~ max(., na.rm = TRUE), s_dev = ~ sd(., na.rm = TRUE)))
- jclousemtcars
数据集。library(dplyr)
您始终可以使用summarise
来避免冗长的语法:
mtcars %>%
group_by(cyl) %>%
summarise(mean_mpg = mean(mpg, na.rm=T),
sd_mpg = sd(mpg, na.rm = T))
dplyr
中,summarise_at
函数将在特定列上对数据集进行汇总,并允许删除每个应用函数的NAs。以鸢尾花数据集为例,计算从萼片长度到花瓣宽度变量的平均值和中位数。library(dplyr)
summarise_at(iris,vars(Sepal.Length:Petal.Width),funs(mean,median),na.rm=T)
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))
这也可能有所帮助!summarize_at(c("voltage","current"), funs(min,max), na.rm =TRUE)
summarise_each()
已被弃用。 在summarise_all
中,你可以在funs
参数后添加na.rm = TRUE
-当你想调用多个函数时很有用,例如:iris %>% group_by(Species) %>% summarise_all(funs(mean, max, sd), na.rm = TRUE)
- tjebo