R语言实现类COUNTIFS功能统计经理直接下属人数
R语言实现等价Excel COUNTIFS函数统计直接下属人数
问题场景
需要统计每位员工作为直属经理对应的直接下属人数,等价于Excel中COUNTIFS函数的条件计数效果。此前尝试group_by搭配length函数实现未得到正确结果,测试用数据如下:
- 员工(employee)字段取值:a、b、c、d、e、f、g、h
- 直属经理(manager)字段取值:g、a、a、a、b、b、e、c
- 预期直接下属数(direct report)输出:3、2、1、0、1、0、0、0
实现方法
方法1:base R 原生实现(最贴合COUNTIFS逻辑)
核心逻辑和Excel COUNTIFS完全一致:逐行统计「经理列等于当前员工ID」的记录数,无匹配时返回0,不需要加载第三方包。
首先构造测试数据:
# 构造示例数据集 emp_df <- data.frame( employee = letters[1:8], manager = c("g", "a", "a", "a", "b", "b", "e", "c") )
运行计数代码:
# 逐行匹配计数,等价于Excel =COUNTIFS(B:B,A2) 下拉填充 emp_df$direct_report <- sapply(emp_df$employee, \(emp_id) sum(emp_df$manager == emp_id))
运行后直接得到预期输出,不需要额外做缺失值填充。
方法2:dplyr 分组实现(修正此前group_by写法的错误)
之前用group_by+length出问题的核心原因:仅对manager列分组计数时,只会统计有下属的经理的数值,没有下属的员工不会出现在分组结果里,自然无法得到全量员工的0值计数。正确写法需要把分组计数结果关联回全量员工表,补全0值:
library(dplyr) library(tidyr) emp_df <- emp_df %>% # 先统计每个经理名下的下属数量 count(manager, name = "temp_count") %>% # 右连接回原员工表,保留所有员工记录 right_join(emp_df, by = c("manager" = "employee")) %>% # 无下属的员工计数填充为0 mutate(direct_report = replace_na(temp_count, 0)) %>% # 保留需要的列,还原原表顺序 select(employee, manager, direct_report)
注意:如果是多条件计数的COUNTIFS场景,只需要在sum判断里追加条件即可,比如要统计部门为销售、且直属经理为当前员工的人数,写法为
sum(emp_df$manager == emp_id & emp_df$dept == "销售"),逻辑和Excel COUNTIFS多参数条件完全对齐。
内容的提问来源于stack exchange,提问作者Amanetas
相关产品推荐
相关产品推荐

