基于多虚拟变量,用dplyr在R中聚合数据框的优化方法问询
优化方案:用长表统一处理重复逻辑
你可以通过宽表转长表的方式消除重复代码,借助dplyr与tidyr的组合一次性完成所有任务的占比计算,最后再转回宽表得到目标格式:
library(tidyverse) EarlyAccess <- read_csv("https://dropbox.com/s/antzwk1jh4ldrhi/EarlyAccess_anon.csv?dl=1") Protein_design_tasks <- EarlyAccess %>% # 一次性筛选公司规模列和所有蛋白质设计任务列 select(size, matches("Improving\\.")) %>% # 宽表转长表:将多个任务列合并为「任务编码」「选择响应」两列 pivot_longer( cols = -size, names_to = "task_code", values_to = "response" ) %>% # 按公司规模+任务分组,统一计算占比 group_by(size, task_code) %>% summarise( total = n(), # 提取当前任务的正式名称(对应原代码中filter的匹配值) task_name = first(response[response != ""]), # 计算该任务的选择占比 pc_var = sum(response == task_name) / total * 100, .groups = "drop" ) %>% # 长表转回宽表,还原「每个任务占比为单独列」的结构 pivot_wider( id_cols = size, names_from = task_name, values_from = pc_var, names_prefix = "pc_" )
关键优化说明:
- 消除重复代码:无需为每个任务单独写一遍聚合逻辑,转长表后所有任务共享一套计算规则
- 灵活扩展:后续新增任务列时,只需调整
select的匹配规则(或直接添加列名),无需修改核心计算代码 - 逻辑清晰:通过「宽→长→宽」的转换,把重复的分组、计算、筛选操作合并为统一流程
内容的提问来源于stack exchange,提问作者Sytske
相关产品推荐
相关产品推荐

