R语言按组移除B-AL二次出现及AL-X后续行的实现咨询
解决方案:按条件过滤数据集并计算平均工资
针对你的大型数据集处理需求,用dplyr可以高效完成分组过滤和统计,以下是具体实现:
1. 加载依赖包
library(dplyr)
2. 按条件过滤数据集
processed_data <- your_data %>% group_by(ID) %>% mutate( # 标记当前ID中第一个"AL-X"的行号,无则设为无穷大 al_x_pos = ifelse(any(status == "AL-X"), which(status == "AL-X")[1], Inf), # 标记当前ID中第二个"B-AL"的行号,不足两次则设为无穷大 b_al_2nd_pos = ifelse(sum(status == "B-AL") >= 2, which(status == "B-AL")[2], Inf), # 计算截止行号:取"AL-X"行(含)和"B-AL"第二次出现前一行的最小值 cutoff = min(al_x_pos, b_al_2nd_pos - 1, na.rm = TRUE) ) %>% # 保留截止行号之前的所有行 filter(row_number() <= cutoff) %>% # 清理辅助列 select(-al_x_pos, -b_al_2nd_pos, -cutoff) %>% ungroup()
3. 计算平均工资
如果需要按状态+ID分组计算平均工资:
avg_salary <- processed_data %>% group_by(status, ID) %>% summarise(avg_salary = mean(salary, na.rm = TRUE), .groups = "drop")
如果只需按状态计算整体平均:
avg_salary <- processed_data %>% group_by(status) %>% summarise(avg_salary = mean(salary, na.rm = TRUE), .groups = "drop")
关键说明
- 你的
cumsum()思路是可行的,但直接用which()定位触发位置更直观,且dplyr的向量化分组操作对大型数据集更高效,避免循环开销 - 两个条件取最早触发的截止点:如果某个ID先出现"AL-X",则保留到该行;如果"B-AL"第二次出现更早,则停在第二次出现的前一行
na.rm = TRUE用于处理无对应状态的ID,避免计算时出现报错
内容的提问来源于stack exchange,提问作者rstarter
相关产品推荐
相关产品推荐

