使用dplyr计算组平均值,同时排除当前观察值

And*_*rew 6 r dataframe dplyr

使用dplyr(优选地),我试图计算每个观察的组平均值,同时从该组中排除该观察结果.

看来,这应该是可行的与组合rowwise()group_by(),但是这两种功能不能同时使用.

鉴于此数据框架:

df <- data_frame(grouping = rep(LETTERS[1:5], 3),
                 value = 1:15) %>%
  arrange(grouping)
df
#> Source: local data frame [15 x 2]
#> 
#>    grouping value
#>       (chr) (int)
#> 1         A     1
#> 2         A     6
#> 3         A    11
#> 4         B     2
#> 5         B     7
#> 6         B    12
#> 7         C     3
#> 8         C     8
#> 9         C    13
#> 10        D     4
#> 11        D     9
#> 12        D    14
#> 13        E     5
#> 14        E    10
#> 15        E    15
Run Code Online (Sandbox Code Playgroud)

我希望每组观察得到该组的平均值,并将该观察结果从该组中排除,导致:

#>    grouping value special_mean
#>       (chr) (int)
#> 1         A     1          8.5  # i.e. (6 + 11) / 2
#> 2         A     6            6  # i.e. (1 + 11) / 2
#> 3         A    11          3.5  # i.e. (1 + 6) / 2
#> 4         B     2          9.5
#> 5         B     7            7
#> 6         B    12          4.5
#> 7         C     3          ...
Run Code Online (Sandbox Code Playgroud)

我已经尝试rowwise()在一个名为by的函数内嵌套do(),但是没有让它按照以下方式工作:

special_avg <- function(chunk) {
  chunk %>%
    rowwise() #%>%
    # filter or something...?
}

df %>%
  group_by(grouping) %>%
  do(special_avg(.))
Run Code Online (Sandbox Code Playgroud)

mto*_*oto 10

无需定义自定义函数,而是简单地对该组的所有元素求和,减去当前值,并除以每组的元素数减去1.

df %>% group_by(grouping) %>%
        mutate(special_mean = (sum(value) - value)/(n()-1))
#   grouping value special_mean
#      (chr) (int)        (dbl)
#1         A     1          8.5
#2         A     6          6.0
#3         A    11          3.5
#4         B     2          9.5
#5         B     7          7.0
Run Code Online (Sandbox Code Playgroud)

  • 很好,但是如果我们想使用另一个函数,比如 `max` 怎么办? (3认同)