R语言 在不中断管道工作流(或连接回临时数据块)的情况下获取组均值的中位数

ykejflvf  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(67)

我的数据有一个分组变量group,我想找到x的组均值的中位数,这样我就可以标记组均值x高于组均值中位数x的组。
如果我将组平均值保存为一个tibble temp,将x_meanmedian(x_mean)进行比较,然后合并回temp,则此计算很容易。

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年7月29日创建

j7dteeu8

j7dteeu81#

只需使用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
dfty9e19

dfty9e192#

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)

相关问题