如何在R中透视数据并执行自定义行级计算?
解决思路与代码实现
核心思路
通过正则拆分列名,将「完成状态列」和「是否需要完成列」配对,过滤出需要完成该指标的人群后,按指标分组计算完成数和完成率。
完整代码
library(tidyverse) # 示例数据集 df <- data.frame( person = c("Alice", "Bob", "Charlie", "Jen","Zar"), filed_taxes = c(1,0,1,0,0), required_to_file_taxes =c(1,1,1,0,0), bought_items = c(1,1,1,0,1), required_to_buy_items = c(1,1,1,1,1), took_vacation = c(1,0,0,1,1), required_to_take_vacation = c(1,1,1,1,1) ) # 计算完成率 df %>% # 拆分列名:提取类型(required/completed)和指标名称 pivot_longer( cols = -person, names_to = c("type", "Measure"), names_pattern = "(required_to_)?(.*)", values_fill = list(type = "completed") ) %>% # 将类型转为列,实现完成状态与需完成状态的配对 pivot_wider(names_from = type, values_from = value) %>% # 仅保留需要完成该指标的人群 filter(required == 1) %>% # 按指标分组计算核心数据 group_by(Measure) %>% summarise( Completed = sum(completed), `% Completed` = paste0(round(Completed / n() * 100), "%") ) %>% # 调整指标顺序匹配期望输出 arrange(factor(Measure, levels = c("filed_taxes", "bought_items", "took_vacation")))
步骤解释
- 拆分列名:用正则表达式
(required_to_)?(.*)拆分列名,带required_to_前缀的标记为required类型,其余标记为completed类型,同时提取统一的指标名称(如filed_taxes)。 - 转宽格式配对:将
type列转为表头,让每行对应「一个人+一个指标」的完成状态与需完成状态的配对数据。 - 过滤有效人群:只保留
required == 1的行,排除不需要完成该指标的人,避免干扰计算结果。 - 分组汇总计算:按指标分组,统计完成人数,再用完成人数除以该指标的总需完成人数,得到百分比并格式化。
- 调整顺序:按期望输出的指标顺序排列结果。
内容的提问来源于stack exchange,提问作者cowboy
相关产品推荐
相关产品推荐

