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

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

原代码出问题的原因

你之前的代码有两个核心问题:

  1. 在summarize里用了df[hybrid == 1]——这会直接调用整个原始数据框,而不是当前分组的子集,自然没法按企业统计;
  2. length(unique(df[hybrid == 1]))的逻辑不对:df[hybrid ==1]是一个完整的数据框,length()返回的是它的列数,根本不是你要的员工数量。

用dplyr分组的时候,在summarize里直接写列名,就会自动针对当前分组的数据进行计算,不用再额外加df$或者df[]哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:27:29