You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:25:10