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_)
这可以通过 sort
和 tail
以紧凑的方式完成
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
我对数据进行了分组,我想在忽略组中的 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_)
这可以通过 sort
和 tail
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