R语言:如何正确计算两期员工ID字符串中的新增员工数量?
问题:统计时间段内新增员工数量出错
需要统计管理者在时间段1到时间段2内新增的员工数量,现有管理者下属所有员工ID组成的字符串(以“, ”分隔)。编写的代码始终显示新增1个员工,但实际应为2个(Q3新增55555和66666),如何修正?
原始代码:
library(dplyr) library(stringr) #First data set mydata_q2 <- tibble( leader = 1, reports_q2 = "2222, 3333, 4444" ) #Second dataset mydata_q3 <- tibble( leader = 1, reports_q3 = "2222, 3333, 4444, 55555, 66666" ) #Function to count number of new employees calculate_number_new_emps <- function(reports_time1, reports_time2) { time_1_reports <- ifelse(is.na(reports_time1), character(0), str_split(reports_time1, " ,\\s*")[[1]]) time_2_reports <- str_split(reports_time2, " ,\\s*")[[1]] num_new_employees <- length(setdiff(time_1_reports, time_2_reports)) num_new_employees } #Join data and count number of new staff--get wrong answer mydata_q2 %>% left_join(mydata_q3) %>% mutate(new_staff_count = calculate_number_new_emps(reports_q2, reports_q3))
错误原因
- 分隔符正则表达式错误:
str_split中使用的分隔符是" ,\\s*"(先空格后逗号),但实际字符串的分隔是", "(先逗号后空格),导致无法正确分割员工ID,最终每个时间段的员工ID被当作单个字符串处理。 - 集合差集顺序错误:
setdiff(time_1_reports, time_2_reports)计算的是时间段1有但时间段2没有的员工,而我们需要的是时间段2新增的(即时间段2有但时间段1没有的),顺序完全搞反了。
修正后的代码
library(dplyr) library(stringr) mydata_q2 <- tibble( leader = 1, reports_q2 = "2222, 3333, 4444" ) mydata_q3 <- tibble( leader = 1, reports_q3 = "2222, 3333, 4444, 55555, 66666" ) calculate_number_new_emps <- function(reports_time1, reports_time2) { # 修正分隔符,用str_split_1直接返回向量,无需手动取[[1]] time_1_reports <- ifelse(is.na(reports_time1), character(0), str_split_1(reports_time1, ",\\s*")) time_2_reports <- str_split_1(reports_time2, ",\\s*") # 调整setdiff顺序,取time_2有但time_1没有的元素,即新增员工 num_new_employees <- length(setdiff(time_2_reports, time_1_reports)) num_new_employees } # 运行后得到正确的new_staff_count=2 mydata_q2 %>% left_join(mydata_q3) %>% mutate(new_staff_count = calculate_number_new_emps(reports_q2, reports_q3))
额外优化说明
- 使用
str_split_1替代str_split(...)[[1]],代码更简洁,直接返回分割后的字符向量。 - 保留NA处理逻辑,确保当时间段1没有员工数据时,能正确统计时间段2的所有员工为新增。
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

