Dplyr sumise_each 使用 na.rm

有没有一种方法可以指导 dplyr使用 summarise_eachna.rm=TRUE?我想用 summarise_each("mean")取变量的平均值,但是我不知道如何指定它来忽略丢失的值。

102125 次浏览

按照文档中的链接,似乎你可以使用 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的选项。

  • 仍然可以将 na.rm = TRUE 内心指定为 funs参数(cf@flodel 的答案是: 只需将 summarise_each替换为 summarise_all)。
  • 但是您也可以添加 na.rm = TRUE 之后funs参数。

当你只想调用一个以上的函数时,这是非常有用的,例如:

编辑

由于@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))


mtcars数据集为例

library(dplyr)

你总是可以使用 summarise来避免冗长的语法:

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

我不知道我的回答是否会对之前的评论有所补充,希望是的。

在我的案例中,我有一个来自两组(对照组,exp)的实验数据库,对于一个特定的变量(日)有不同的水平,我想要得到另一个变量(权重)的每个组对于变量日的特定水平的平均值和 sd 的总结。

下面是我的数据库的一个例子:

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

例如,在这个例子中,我想得到每个组(control,exp)在第73天的平均体重和 sd,省略了 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))

dplyr中的 summarise_at函数将在特定列汇总数据集,并允许删除应用的每个函数的 NA。取虹膜数据集,计算 Sepal 变量的平均值和中位数。花瓣长度。宽度。

library(dplyr)
summarise_at(iris,vars(Sepal.Length:Petal.Width),funs(mean,median),na.rm=T)


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