【问题标题】:Best way to calculate quartile ranges of population ages and store results as a data frame in R计算人口年龄四分位数范围并将结果存储为 R 中的数据框的最佳方法
【发布时间】:2021-06-27 10:07:50
【问题描述】:

我有一个数据框,其中包含多年来每年的人口数据。我想获得每年的中位数、Q1 和 Q3 年龄,并将结果存储为新数据框。解决这个问题的最佳方法是什么?这是我的数据示例。每一年列包含相应年龄的人数:

Age | 2000 | 2001 | 2002 
------------------------
2   | 4    | 1    | 2   
3   | 6    | 3    | 5  
4   | 10   | 9    | 8 
5   | 8    | 9    | 8
6   | 7    | 7    | 8

编辑:只是为了添加更多细节。要获得中位数和四分位数范围,我很可能需要获得每年的累积频率。我可以创建一个包含所有 CF 的数据框并加入年龄列,并在此基础上创建一个具有中位数和 q 范围年龄的新数据框,但我确信有一种更有效的方法。

【问题讨论】:

    标签: r dataframe quantile


    【解决方案1】:

    确定基于您的描述我更新了我的代码。首先我每年递增年龄分布,然后计算所需的统计信息:

    library(dplyr)
    library(tidyr)
    
    df <- tribble(
      ~ Age,  ~`2000`,  ~`2001`,  ~`2002`, 
      
      2,    4,     1,     2,   
      3,    6,     3,     5,  
      4,    10,    9,     8, 
      5,    8,     9,     8,
      6,    7,     7,     8
    )
    
    
    
    df %>%
      rowwise() %>%
      mutate(across(`2000`:`2002`, ~ list(rep(Age, .x)))) %>%
      pivot_longer(- Age, names_to = "years", values_to = "values") %>%
      unnest(values) %>% 
      select(-Age) %>%
      group_by(years) %>%
      summarise(medians = median(values),
                quantiles = list(quantile(values, probs = c(0.25, 0.75)))) %>%
      unnest_wider(quantiles)
    
    # A tibble: 3 x 4
      years medians `25%` `75%`
      <chr>   <dbl> <dbl> <dbl>
    1 2000        4     3   5  
    2 2001        5     4   5  
    3 2002        5     4   5.5
    
    

    如果您需要进一步的解释,请告诉我。

    【讨论】:

    • 我不确定这是我正在寻找的。我每年需要中位数和四分位数。因此,例如,2000年有四名2岁的孩子,六年3岁,十岁4岁等,所以我想我需要为每年创造某种累积频率,并根据该跨度计算中位数等>
    • 确定我只是更新了我的代码。请检查出来。 span>
    • 感谢您的更新。此示例也有效 span>
    • 我的荣幸。我只是不明白你最初想要的东西。很高兴它终于锻炼了。 span>
    【解决方案2】:

    tidyr 包中有一个非常有用的函数uncount,我们可以使用它。首先,我们使用pivot_longer 将年份列移动为行。然后,我们使用uncount,以便每个年龄出现的次数与其出现的次数一样多。然后,group_by 年份并使用summarise 计算汇总统计信息。

    library(tidyverse)
    
    dat %>%
        pivot_longer(-Age, 
                     names_to = "year", 
                     names_prefix = "X", 
                     values_to = "cnt") %>%
        uncount(cnt) %>%
        group_by(year) %>%
        summarise(q25 = quantile(Age, .25),
                  q50 = median(Age),
                  q75 = quantile(Age, .75))
    
    #   year    q25   q50   q75
    #   <chr> <dbl> <int> <dbl>
    # 1 2000      3     4   5  
    # 2 2001      4     5   5  
    # 3 2002      4     5   5.5
    

    这是一个基本的 R 解决方案,使用与 rep 函数类似的想法:

    apply(dat[,-1], 2, 
          FUN = function(x){
              rep_age <- rep(dat$Age, x)
              c(quantile(rep_age, .25), 
                quantile(rep_age, .5), 
                quantile(rep_age, .75))
              })
    
    #     X2000 X2001 X2002
    # 25%     3     4   4.0
    # 50%     4     5   5.0
    # 75%     5     5   5.5
    

    数据

    dat <- structure(list(Age = 2:6, 
                          X2000 = c(4L, 6L, 10L, 8L, 7L), 
                          X2001 = c(1L, 3L, 9L, 9L, 7L), 
                          X2002 = c(2L, 5L, 8L, 8L, 8L)), 
                     class = "data.frame", 
                     row.names = c(NA, -5L))
    

    【讨论】:

    • 我真的很喜欢你使用 uncount 函数的想法。以前从未使用过。谢谢。
    • 谢谢。它的用例似乎有限,所以有理由使用它是令人兴奋的。
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2015-07-17
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多