You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R的Tidyverse按多列汇总立法证人数据并生成宽表?

用Tidyverse实现法案证人数据的宽表汇总

针对你的需求,结合Tidyverse工具包,我们可以通过数据清洗→分组统计→格式转换三步实现目标,以下是具体方案:

方案一:直接分组统计(适合固定类别)

这种方式逻辑直观,适合类别固定的场景:

library(tidyverse)

# 加载原数据
df <- data.frame(bill_number = c(1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4),
                 witness_id= c("Name1", "Name2", "Name3", "Name4", "Name5", "Name6", "Name7", "Name8", "Name9", "Name10", "Name11", "Name12", "Name13"),
                 witness_race = c("Black", "White", "White", "Black", "White", "White", "White", "Asian", "White", "White White", "Black", "Black", "White"),
                 witness_gender = c("Male", "Male", "Male", "Female", "Male", "Female", "Male", "Male", "Male", "Female", "Female", "Female", "Female"))

# 数据处理与汇总
df1 <- df %>%
  # 修正种族列的异常值:将"White White"改为"White",保证统计准确
  mutate(witness_race = str_replace(witness_race, "White White", "White")) %>%
  # 按法案编号分组,后续统计基于单个法案
  group_by(bill_number) %>%
  # 统计各类别证人数量
  summarize(
    number_white_witnesses = sum(witness_race == "White"),
    number_black_witnesses = sum(witness_race == "Black"),
    number_asian_witnesses = sum(witness_race == "Asian"),
    number_female_witnesses = sum(witness_gender == "Female"),
    number_male_witnesses = sum(witness_gender == "Male")
  ) %>%
  # 取消分组,恢复普通数据框格式
  ungroup()

# 查看最终结果
df1

步骤说明:

  • mutate(str_replace(...)):修复原始数据中witness_race列的错误值,避免统计偏差。
  • group_by(bill_number):指定按法案编号分组,确保后续统计都是针对单个法案的。
  • summarize():通过sum(条件判断)统计每组内符合要求的证人数量,比如sum(witness_gender == "Female")就是统计当前法案的女性证人总数。
  • ungroup():取消分组标记,避免后续操作受分组状态影响。

方案二:动态转换格式(适合类别可能新增的场景)

如果后续可能新增种族或性别类别,这种方式无需修改统计逻辑,自动适配新类别:

df1_alternative <- df %>%
  # 先修正异常值
  mutate(witness_race = str_replace(witness_race, "White White", "White")) %>%
  # 将种族、性别列转成长格式,统一处理统计
  pivot_longer(cols = c(witness_race, witness_gender),
               names_to = "category_type",
               values_to = "category_value") %>%
  # 按法案、类别类型、具体值分组计数
  count(bill_number, category_type, category_value) %>%
  # 生成目标列名:比如把"witness_race-White"转为"number_white_witnesses"
  mutate(col_name = str_c("number_", str_to_lower(str_remove(category_type, "witness_")), "_witnesses")) %>%
  # 转成宽表,缺失的类别填充0
  pivot_wider(id_cols = bill_number,
              names_from = col_name,
              values_from = n,
              values_fill = 0) %>%
  # 调整列顺序与期望结果一致
  select(bill_number, number_white_witnesses, number_black_witnesses, number_asian_witnesses, number_female_witnesses, number_male_witnesses)

优势:

当新增种族(如拉丁裔)或性别类别时,不需要修改统计代码,运行后自动生成对应的统计列。


内容的提问来源于stack exchange,提问作者user17073706

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:41:10