【问题标题】:how to calculate weighted median by groups如何按组计算加权中位数
【发布时间】:2021-08-23 12:44:49
【问题描述】:

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

我的 DF 如下:原来的 df 要大得多,而且有更多的部门和职业。但是结构是一样的。

性别 部门 职业 年龄 体重 马 1 45 13.12 F C 1 23 7.05 马 3 67 34.12 马 3 23 11.00 F C 1 33 17.45 FA 1 35 45.01 F C 3 57 21.45 MC 1 32 23.33 FA 3 48 44.54 马 1 25 13.12 F C 1 27 7.05 马 3 37 34.12 马 3 26 11.00 F C 1 73 17.45 FA 1 49 45.01 F C 3 24 21.45 MC 1 25 23.33 FA 3 35 44.54 马 1 48 13.12 F C 1 83 7.05 马 3 66 34.12 马 3 43 11.00 F C 1 36 17.45 FA 1 35 45.01 F C 3 57 21.45 MC 1 22 23.33 FA 3 47 44.54 马 1 55 13.12 F C 1 28 7.05 马 3 27 34.12 马 3 25 11.00 F C 1 23 17.45 FA 1 46 45.01 F C 3 34 21.45 MC 1 27 23.33 FA 3 65 44.54

这是我需要的结果。注意!这里的中位年龄是假的。它只是代表最终结果的结构。

性别 部门 职业 年龄中位数 硕士 1 23 马 3 34 中号 C 1 45 MC 3 23 法甲 1 34 FA 3 45 F C 1 43 F C 3 34

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

weighted median by_group()

【问题讨论】:

    标签: r dplyr median weighted


    【解决方案1】:

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

    在链接的帖子中,它使用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))
    

    【讨论】:

      猜你喜欢
      • 2021-02-26
      • 2014-01-03
      • 2021-01-26
      • 2021-10-01
      • 2021-09-10
      • 2018-07-22
      • 2012-11-12
      • 1970-01-01
      • 2012-09-14
      相关资源
      最近更新 更多