在不破坏管道工作流(或加入临时小标题)的情况下获取组的中位数

Get median of group means without breaking piped workflow (or joining back temporary tibble)

我的数据有一个分组变量 group,我想找到组均值 x 的中位数,以便我可以标记组均值 x 的组] 高于 x.

的中位数组平均值

如果我将组均值保存为小标题 temp,将 x_meanmedian(x_mean) 进行比较,然后合并回 temp.[=23=,则此计算很容易]

library(tidyverse)

set.seed(2001)

tb <- tibble(group = c(1, 2, rep(3, 3))) %>% 
    mutate(x = runif(n()) + ifelse(group %in% 1:2, 1, 0))
tb
#> # A tibble: 5 x 2
#>   group     x
#>   <dbl> <dbl>
#> 1     1 1.76 
#> 2     2 1.61 
#> 3     3 0.218
#> 4     3 0.229
#> 5     3 0.153

temp <- tb %>% 
    group_by(group) %>% 
    summarize(x_mean = mean(x)) %>% 
    ungroup() %>% 
    mutate(x_hi = (x_mean > median(x_mean)))
temp
#> # A tibble: 3 x 3
#>   group x_mean x_hi 
#>   <dbl>  <dbl> <lgl>
#> 1     1  1.76  TRUE 
#> 2     2  1.61  FALSE
#> 3     3  0.200 FALSE

tb <- inner_join(tb, temp)
#> Joining, by = "group"

这是所需的输出。 4/5 的观察值低于中位数似乎很奇怪,但这是可能的,因为我的组计数不相等。

tb
#> # A tibble: 5 x 4
#>   group     x x_mean x_hi 
#>   <dbl> <dbl>  <dbl> <lgl>
#> 1     1 1.76   1.76  TRUE 
#> 2     2 1.61   1.61  FALSE
#> 3     3 0.218  0.200 FALSE
#> 4     3 0.229  0.200 FALSE
#> 5     3 0.153  0.200 FALSE

我想在不破坏管道工作流程的情况下执行此操作。以下尝试失败,因为我的组有不同的计数。

tb <- tb %>% 
    group_by(group) %>% 
    mutate(x_mean2 = mean(x)) %>% 
    ungroup() %>% 
    mutate(x_hi2 = (x_mean > median(x_mean)))
tb
#> # A tibble: 5 x 6
#>   group     x x_mean x_hi  x_mean2 x_hi2
#>   <dbl> <dbl>  <dbl> <lgl>   <dbl> <lgl>
#> 1     1 1.76   1.76  TRUE    1.76  TRUE 
#> 2     2 1.61   1.61  FALSE   1.61  TRUE 
#> 3     3 0.218  0.200 FALSE   0.200 FALSE
#> 4     3 0.229  0.200 FALSE   0.200 FALSE
#> 5     3 0.153  0.200 FALSE   0.200 FALSE

有没有办法在不破坏我的管道工作流程的情况下获取 x 组平均值的中位数?

reprex package (v0.3.0)

于 2019-07-29 创建

只需使用unique:

library(dplyr)

tb %>% 
  group_by(group) %>% 
  mutate(x_mean = mean(x)) %>% 
  ungroup %>% 
  mutate(x_hi = x_mean > median(unique(x_mean)))

#> # A tibble: 5 x 4
#>   group     x x_mean x_hi 
#>   <dbl> <dbl>  <dbl> <lgl>
#> 1     1 1.76   1.76  TRUE 
#> 2     2 1.61   1.61  FALSE
#> 3     3 0.218  0.200 FALSE
#> 4     3 0.229  0.200 FALSE
#> 5     3 0.153  0.200 FALSE

M-M 的答案适用于特定情况,但我认为如果不止一组具有相同的平均分数,则该答案不准确。

tb %>% 
  group_by(group) %>% 
  mutate(x_mean = mean(x)) %>% 
  ungroup  %>% 
  nest(-x_mean, -group) %>% 
  mutate(x_median = median(x_mean)) %>% 
  unnest %>% 
  mutate(x_hi = x_mean > x_median)