mean() 在 R 中分组数据的 summarise() 中的 slice() 之后不起作用

mean() does not work after slice() in summarise() in a grouped data in R

我对数据进行了分组,我想在忽略组中的 N 个最低值后得到平均值。我的代码看起来类似于下面的代码:

mtcars %>%
  group_by(gear) %>%
  arrange(desc(wt)) %>% 
  summarise(
    n = n(),
    Drop2 = if_else(n() >= 5,
                   slice(1:(n() - 2)) %>% mean(wt), #omit the two lowest value of "wt" then get the mean
                   NA),
    Drop1 = if_else(n() >= 3 & n() < 5,
                   slice(1:(n() - 1)) %>% mean(wt), #omit the lowest value of "wt" then get the mean
                   NA),
    Weight = mean(wt)
  )

然后我得到这个错误:

Error: Problem with `summarise()` input `Drop2`.
x no applicable method for 'slice' applied to an object of class "c('integer', 'numeric')"
i Input `Drop2` is `if_else(n() >= 5, slice(1:(n() - 2)) %>% mean(wt), NA)`.
i The error occurred in group 1: gear = 3.

不太清楚为什么当 Drop2 中 gear = 3 的结果很容易为 NA 时我会收到此错误。

slice的第一个参数是.data,主要用于对行进行子集化。这里 slice(1:(n() - 1)) 没有 .data 输入,只指定索引。将 slice 用作链中的独立步骤更为合适。此外,在 summarise 内执行 slice,然后在 if_else 内执行,这会使它变得复杂。根据代码,我们只需要对 'wt' 列进行子集化,这可以通过直接对该列进行索引来完成

library(dplyr)
mtcars %>%
  group_by(gear) %>%
  arrange(desc(wt)) %>%
  summarise(n = n(), 
           Drop2 = if_else(n() >= 5, mean(wt[1:(n() - 2)], 
                      na.rm = TRUE), NA_real_),
           Drop1 = if_else(n() >=3 & n() < 5, mean(wt[1:(n() - 1)], 
                      na.rm = TRUE), NA_real_),
            Weight = mean(wt))

-输出

# A tibble: 3 x 5
#   gear     n Drop2 Drop1 Weight
#  <dbl> <int> <dbl> <dbl>  <dbl>
#1     3    15  4.05    NA   3.89
#2     4    12  2.80    NA   2.62
#3     5     5  3.17    NA   2.63

此外,由于条件是检查表达式 1 的长度,if/else 更合适

mtcars %>%
 group_by(gear) %>%
 arrange(desc(wt)) %>% 
 summarise(n = n(), Drop2 = if(n() >= 5) mean(wt[1:(n() - 2)]) else  NA_real_)

这可以通过 sorttail

以紧凑的方式完成
mtcars %>% 
    group_by(gear) %>% 
    summarise(n = n(), Weight_top = mean(tail(sort(wt), -2)),
            Weight = mean(wt))
# A tibble: 3 x 4
#   gear     n Weight_top Weight
#* <dbl> <int> <dbl>  <dbl>
#1     3    15  4.05   3.89
#2     4    12  2.80   2.62
#3     5     5  3.17   2.63