R语言使用group_by与summarize按条件分组汇总员工数据问题求助
按企业分组统计员工总数与混合办公员工数的解决方案
看起来你在使用dplyr分组统计时踩了个小坑,没关系,咱们来一步步解决它!
首先先把你的数据还原出来,方便大家一起测试:
df <- data.frame( name = c("Mike", "Kate", "Dan", "Jess", "Mick", "Nate", "Mike"), firm = c("A", "A", "C", "B", "C", "C", "A"), hybrid = c(1, 1, 0, 0, 1, 0, 1) )
匹配你期望结果的正确代码
根据你给出的期望输出,total是企业的总员工记录数(包括同一员工的重复记录),hybrid是该企业内混合办公的员工记录数。用下面的代码就能得到想要的结果:
library(dplyr) df %>% group_by(firm) %>% summarize( total = n(), # 直接统计当前分组内的总记录数 hybrid = sum(hybrid == 1) # 统计分组里hybrid标记为1的数量 )
运行后输出和你期望的完全一致:
# A tibble: 3 × 3 firm total hybrid <chr> <int> <int> 1 A 3 3 2 B 1 0 3 C 3 1
如果你需要统计去重后的员工数
要是你的total实际想统计的是企业里的独特员工数(比如A企业实际是2个员工,而非3条重复记录),可以调整成下面的代码:
df %>% group_by(firm) %>% summarize( total = n_distinct(name), # 统计分组内不重复的员工姓名数量 hybrid = n_distinct(name[hybrid == 1]) # 统计分组内混合办公的独特员工数 )
这个会输出:
# A tibble: 3 × 3 firm total hybrid <chr> <int> <int> 1 A 2 2 2 B 1 0 3 C 3 1
原代码出问题的原因
你之前的代码有两个核心问题:
- 在
summarize里用了df[hybrid == 1]——这会直接调用整个原始数据框,而不是当前分组的子集,自然没法按企业统计; length(unique(df[hybrid == 1]))的逻辑不对:df[hybrid ==1]是一个完整的数据框,length()返回的是它的列数,根本不是你要的员工数量。
用dplyr分组的时候,在summarize里直接写列名,就会自动针对当前分组的数据进行计算,不用再额外加df$或者df[]哦!
内容的提问来源于stack exchange,提问作者questionmark
相关产品推荐
相关产品推荐

