如何计算分组加权中位数

问题描述 投票:0回答:2

我需要通过 3 个变量(性别、部门和职业)计算加权中位年龄。我知道如何使用“spatstat”加权中位数。但它给出了整个 DF 的加权年龄。我不知道如何让它按组/变量进行计算。我在两年前发现了另一篇类似的帖子,但我不明白其中提供的解决方案。我确实知道您需要使用 dplyr 对其进行分组。我对图书馆的了解非常有限。我需要有人向我展示以下 DF 的代码,以便我可以使用它并在将来需要时对其进行一些小的更改。

我的DF如下:原来的DF更大,部门和职业也更多。但结构是一样的。

 
性别 行业 职业 年龄 体重
  中标 1 45 13.12
  足球俱乐部 1 23 7.05
  中号 3 67 34.12
  硕士 3 23 11.00
  足球俱乐部 1 33 17.45
  FA 1 35 45.01
  足球 3 57 21.45
  中号 1 32 23.33
  FA 3 48 44.54
  中标 1 25 13.12
  足球俱乐部 1 27 7.05
  中号 3 37 34.12
  硕士 3 26 11.00
  足球 1 73 17.45
  FA 1 49 45.01
  足球 3 24 21.45
  中号 1 25 23.33
  FA 3 35 44.54
  中标 1 48 13.12
  足球 1 83 7.05
  中号 3 66 34.12
  硕士 3 43 11.00
  足球 1 36 17.45
  FA 1 35 45.01
  足球俱乐部 3 57 21.45
  中号 1 22 23.33
  FA 3 47 44.54
  中标 1 55 13.12
  足球俱乐部 1 28 7.05
  中号 3 27 34.12
  硕士 3 25 11.00
  足球俱乐部 1 23 17.45
  FA 1 46 45.01
  足球 3 34 21.45
  中号 1 27 23.33
  FA 3 65 44.54

这就是我需要的结果。注意!这里的平均年龄是假的。它仅代表最终结果的结构。

性别 行业 职业 年龄中位数
  硕士 1 23
  硕士 3 34
  中号 1 45
  中号 3 23
  FA 1 34
  FA 3 45
  足球俱乐部 1 43
  足球俱乐部 3 34

我发现的问题(上面提到的)我不理解它,因为我不理解 mutate 并且示例中的数据以我无法阅读的方式呈现。我是 R 新手

by_group()的加权中位数

r dplyr median weighted
2个回答
4
投票

weighted.median
包中有一个
spatstat
。 我们可以将其与
tidyverse
方法一起使用,即按“性别”、“部门”和“职业”分组,在
weighted.median
中应用
x
,其中
w
作为“年龄”,
summarise
作为“体重” .

在链接的帖子中,它使用

mutate
创建新列,而
summarise
返回汇总输出,即每组一行。

此外,我们在使用

summarise/mutate
时应该小心,因为这些函数也可以在
plyr
中找到,如果加载了两个包,即使用
dplyr
中的屏蔽函数,它可能会屏蔽
plyr
函数,那么它可能会返回整个数据的
weighted.median
,而不是分组。 因此,要么仅加载
dplyr
要么显式使用
dplyr::summarise

library(dplyr)
library(spatstat)
df1 %>% 
     group_by(Gender, Sector, occupation) %>%
     dplyr::summarise(MedianAge = weighted.median(Age, Weight),
           .groups = 'drop')

-输出

# A tibble: 7 x 4
  Gender Sector occupation MedianAge
  <chr>  <chr>       <int>     <dbl>
1 F      A               1      35  
2 F      A               3      47  
3 F      C               1      31.0
4 F      C               3      34  
5 M      A               1      45  
6 M      A               3      33.8
7 M      C               1      25  

数据

df1 <- structure(list(Gender = c("M", "F", "M", "M", "F", "F", "F", 
"M", "F", "M", "F", "M", "M", "F", "F", "F", "M", "F", "M", "F", 
"M", "M", "F", "F", "F", "M", "F", "M", "F", "M", "M", "F", "F", 
"F", "M", "F"), Sector = c("A", "C", "A", "A", "C", "A", "C", 
"C", "A", "A", "C", "A", "A", "C", "A", "C", "C", "A", "A", "C", 
"A", "A", "C", "A", "C", "C", "A", "A", "C", "A", "A", "C", "A", 
"C", "C", "A"), occupation = c(1L, 1L, 3L, 3L, 1L, 1L, 3L, 1L, 
3L, 1L, 1L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 1L, 1L, 3L, 3L, 1L, 1L, 
3L, 1L, 3L, 1L, 1L, 3L, 3L, 1L, 1L, 3L, 1L, 3L), Age = c(45L, 
23L, 67L, 23L, 33L, 35L, 57L, 32L, 48L, 25L, 27L, 37L, 26L, 73L, 
49L, 24L, 25L, 35L, 48L, 83L, 66L, 43L, 36L, 35L, 57L, 22L, 47L, 
55L, 28L, 27L, 25L, 23L, 46L, 34L, 27L, 65L), Weight = c(13.12, 
7.05, 34.12, 11, 17.45, 45.01, 21.45, 23.33, 44.54, 13.12, 7.05, 
34.12, 11, 17.45, 45.01, 21.45, 23.33, 44.54, 13.12, 7.05, 34.12, 
11, 17.45, 45.01, 21.45, 23.33, 44.54, 13.12, 7.05, 34.12, 11, 
17.45, 45.01, 21.45, 23.33, 44.54)), class = "data.frame", row.names = c(NA, 
-36L))

0
投票

请参阅我的答案此处,以获取使用

collapse::fmedian()
的快速解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.