基于R语言实现人员流失(dropout)检测的脚本开发需求
R脚本:人员流失(Dropout)检测实现
需求说明
基于年度参与数据开发R脚本,计算人员的n_dropout(首次参与后出现的缺失次数),并据此标记是否为流失人员。
原始数据集
library(data.table) datos <- data.frame( name = c("LAVAYEN LAVAYEN JOSE ANTONIO", "LAVAYEN LAVAYEN JHON JAIRO", "LEON LEON LUIS ALEJANDRO", "LIMA MARTINEZ AURORA YSABELL", "MONTALVAN MEJIA JOSE NICOLAS", "RODRIGUEZ ROMERO DIGNA LISSETH", "ULCUANGO CONLAGO PEDRO DAVID"), Id = c("aa", "bb", "cc", "dd", "ee", "ff", "gg"), `2017` = c(1, NA, 1, NA, NA, 1, NA), `2018` = c(1, NA, 1, NA, 1, NA, 1), `2019` = c(NA, 1, NA, NA, 1, 1, 1), `2020` = c(NA, 1, NA, NA, NA, NA, NA), `2021` = c(NA, 1, NA, NA, 1, 1, 1), `2022` = c(NA, 1, NA, NA, 1, NA, NA), `2023` = c(NA, 1, NA, 1, 1, 1, 1), stringsAsFactors = FALSE ) %>% as.data.table()
修正后的实现代码
原参考脚本存在列名匹配错误(.SDcols误写为X2017),以下是修正并补充流失标记的完整代码:
# 计算首次参与后缺失次数的辅助函数 helper <- function(x) { # 定位第一个非NA值的位置(首次参与年份) i <- Position(\(x) !is.na(x), x) # 若从未参与,返回0 if (is.na(i)) return(0L) # 统计首次参与后到末尾的缺失次数 sum(is.na(x[i:length(x)])) } # 按人员分组计算n_dropout datos[, n_dropout := helper(unlist(.SD)), .SDcols = `2017`:`2023`, by = .(name, Id)] # 添加流失标记:n_dropout>0则判定为流失人员 datos[, is_dropout := ifelse(n_dropout > 0, "是", "否")] # 查看结果 datos
核心逻辑说明
helper函数:先找到人员首次参与的年份,再统计该年份之后所有年度的缺失次数,即n_dropout- 流失判定规则:当
n_dropout > 0时,标记为流失人员 - 分组计算:按
name和Id分组,确保每个人员的计算独立
示例输出
运行代码后,输出将包含n_dropout和is_dropout列,示例如下:
name Id 2017 2018 2019 2020 2021 2022 2023 n_dropout is_dropout <char> <char> <num> <num> <num> <num> <num> <num> <num> <int> <char> 1: LAVAYEN LAVAYEN JOSE ANTONIO aa 1 1 NA NA NA NA NA 4 是 2: LAVAYEN LAVAYEN JHON JAIRO bb NA NA 1 1 1 1 1 0 否 3: LEON LEON LUIS ALEJANDRO cc 1 1 NA NA NA NA NA 4 是 4: LIMA MARTINEZ AURORA YSABELL dd NA NA NA NA NA NA 1 0 否 5: MONTALVAN MEJIA JOSE NICOLAS ee NA 1 1 NA 1 1 1 1 是 6: RODRIGUEZ ROMERO DIGNA LISSETH ff 1 NA 1 NA 1 NA 1 3 是 7: ULCUANGO CONLAGO PEDRO DAVID gg NA 1 1 NA 1 NA 1 2 是
内容的提问来源于stack exchange,提问作者cdcarrion
相关产品推荐
相关产品推荐

