R语言中如何将同时属于多部门的人员按0.5分别计入对应部门统计
R语言中如何将同时属于多部门的人员按0.5分别计入对应部门统计
你这个思路其实已经走对一半啦!拆分部门列确实是关键的第一步,接下来只需要把拆分后的宽格式数据转成长格式,再给每个部门行分配对应的权重,最后求和就能得到你想要的结果了。
结合你已经写好的代码,我们可以继续往下完善:
library(tidyverse) # 承接你完成的部门拆分步骤 Grad_Applied_Formatted1 <- Grad_AppAccMat %>% separate_wider_delim(DEPT, "/", names = c("DEPT1", "DEPT2"), too_few = "align_start", cols_remove = FALSE) # 转长格式并计算部门统计数 final_result <- Grad_Applied_Formatted1 %>% # 将拆分后的DEPT1、DEPT2转为单部门行,自动过滤空值 pivot_longer( cols = starts_with("DEPT"), names_to = "temp_col", values_to = "DEPT_Clean", values_drop_na = TRUE ) %>% # 按ID分组,计算每个ID对应的部门数量,得到权重 group_by(`ID Number`) %>% mutate(weight = 1/n()) %>% ungroup() %>% # 按部门分组求和权重,得到最终统计 group_by(DEPT_Clean) %>% summarize(Count = sum(weight)) %>% rename(DEPT = DEPT_Clean) # 重命名列名匹配目标输出
我来给你拆解下每一步的作用:
pivot_longer:把原来的宽格式(一行多个部门)转成长格式(一行一个部门),values_drop_na = TRUE会自动去掉那些只有单个部门时产生的空值行;- 按
ID Number分组后,n()会返回每个ID对应的部门数量,weight = 1/n()就得到了每个部门应占的权重——比如ID18有2个部门,权重就是0.5;单个部门的ID权重就是1; - 最后按部门分组求和权重,就能得到每个部门的最终统计数,完全符合你想要的输出效果。
另外这个方案还有个好处:如果以后遇到一个人属于3个甚至更多部门的情况,代码不需要修改,依然能自动计算出对应的权重(比如3个部门就是1/3),通用性很强。
备注:内容来源于stack exchange,提问作者asokol
相关产品推荐
相关产品推荐

