代码之家  ›  专栏  ›  技术社区  ›  AlexC

如何循环dplyr group_by并总结变量列表的语句

  •  0
  • AlexC  · 技术社区  · 10 月前

    我正试图从变量列表中创建多个二五汇总表。理想情况下,我想附加这些表。

    我的数据框架看起来像这样,有多个人口统计变量、一个ID变量和一个二进制变量,用于确定该年是否是目标干预年:

    身份证件 性别 种族 年龄类别 目标年份
    1234 男性 白色 18-25 1.
    5675 女性 亚洲的 30-35 0

    我试图为TargetYear和人口统计变量(TargetYear+性别、TargetYear+种族等)的每种组合创建交叉表摘要。我知道我可能可以在循环或函数中完成这项工作,但到目前为止还没有成功。

    在定义变量后,我最初试图通过for循环和dplyr摘要的组合来实现这一点:

    library(dplyr)
    library(tidyr)
    
    variables <- c("Gender", "Race", "AgeCategory")
    
    agg <- NULL
    
    for (i in variables){
      u <- df %>% group_by(TargetYear, (i)) %>% summarize(n=n_distinct(ID)) %>% ungroup() %>% mutate(total=sum(n)) %>% group_by(TargetYear, (i)) %>% pivot_longer((i))
      return(u)
      bind_rows(agg, u)
    }
    

    我期待的地方:

    目标年份 n 全部的 名称 价值
    1. 5. 30 性别 男性
    0 10 30 性别 男性
    1. 3. 30 性别 女性
    0 12 30 性别 女性
    1. 10 50 种族 白色
    0 20 50 种族 白色
    1. 23 50 种族 亚洲的
    0 27 50 种族 亚洲的

    相反,只得到一个NULL agg和一个u:

    目标年份 (i) n 全部的
    0 性别 15 30
    1. 性别 15 30

    我对循环和函数非常陌生,所以我不确定我在这里哪里出了问题。任何帮助都将不胜感激!特别是利用循环和函数的解决方案。

    1 回复  |  直到 10 月前
        1
  •  1
  •   LMc    10 月前

    无需循环:

    library(tidyr)
    library(dplyr)
    
    df |>
      pivot_longer(Gender:AgeCategory) |>
      mutate(total = n_distinct(ID))  |>
      summarize(n = n(), total = unique(total), .by = c(name, value, TargetYear))
    #   name        value  TargetYear     n total
    #   <chr>       <chr>       <int> <int> <int>
    # 1 Gender      Male            1     1     2
    # 2 Race        White           1     1     2
    # 3 AgeCategory 18-25           1     1     2
    # 4 Gender      Female          0     1     2
    # 5 Race        Asian           0     1     2
    # 6 AgeCategory 30-35           0     1     2