基于自上而下法的员工分摊:求R语言计算Adjusted_FTE的解决方案
基于data.table的层级FTE分配解决方案
步骤1:构造示例数据
先模拟符合需求的Employees和FTE表,用于验证逻辑:
library(data.table) # 员工表:记录姓名、职位、地点 Employees <- data.table( Name = paste0("Emp", 1:10), Job_Title = c("Manager", "Manager", "Analyst", "Analyst", "Analyst", "Analyst", "Clerk", "Clerk", "Clerk", "Clerk"), Location = c("New York", "New York", "New York", "New York", "London", "London", "New York", "London", "London", "Paris") ) # FTE配置表:按优先级排序的分组规则、期望累计FTE FTE <- data.table( Group_Type = c("Job_Title", "Location"), Group_Value = c("Manager", "New York"), Cumulative_FTE_Desired = c(2, 5) )
步骤2:核心层级分配逻辑
通过循环结合data.table的高效筛选,实现自上而下的员工分配——每处理完一组就标记已分配员工,后续组自动排除这些人员,最终计算出Adjusted_FTE:
# 给员工表添加「已分配」标记列 Employees[, Assigned := FALSE] # 初始化FTE表的Adjusted_FTE列 FTE[, Adjusted_FTE := 0] # 按FTE表的行顺序(优先级)遍历处理 for (i in 1:nrow(FTE)) { # 提取当前分组的规则和期望FTE group_col <- FTE$Group_Type[i] group_val <- FTE$Group_Value[i] desired_fte <- FTE$Cumulative_FTE_Desired[i] # 筛选未分配且符合当前分组条件的员工 eligible_emps <- Employees[!Assigned & get(group_col) == group_val] # 计算实际可分配数量:取期望数和剩余符合条件员工数的最小值 actual_assign <- min(desired_fte, nrow(eligible_emps)) # 更新FTE表的Adjusted_FTE值 FTE[i, Adjusted_FTE := actual_assign] # 标记这些员工为已分配,后续分组不再纳入筛选范围 if (actual_assign > 0) { Employees[Name %in% eligible_emps$Name[1:actual_assign], Assigned := TRUE] } }
验证结果
运行后查看FTE表,会得到符合需求的Adjusted_FTE:
print(FTE) # Group_Type Group_Value Cumulative_FTE_Desired Adjusted_FTE # 1: Job_Title Manager 2 2 # 2: Location New York 5 3 # 前2个Manager已分配,纽约剩余符合条件的员工为3人
员工表的Assigned列会清晰标记出已被分配的人员,方便后续核对。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

