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

R语言中如何删除分组观测的末尾0和对应的最后一个1

R语言实现DataFrame按分组修剪观测的方案

结论

不需要手动处理,通过分组向量运算即可批量完成需求。

实现步骤

1. 依赖准备

使用dplyr包实现分组操作,若未安装可先运行install.packages("dplyr")。

2. 示例数据构造

library(dplyr)

# 构造与题目一致的示例数据
df <- tibble(
  person = rep(c("a", "b", "c"), times = c(5, 3, 5)),
  outcome = c(1,1,0,0,0, 1,0,1, 1,1,0,0,0)
)

3. 核心处理代码

按人员分组后,通过游程编码(RLE)计算末尾连续0的长度,再按规则修剪观测:

df_result <- df %>%
  # 按人员标识分组
  group_by(person) %>%
  # 对每个分组单独处理
  group_modify(~ {
    outcome_vec <- .x$outcome
    total_len <- length(outcome_vec)
    # 末尾为1直接保留全部观测
    if (outcome_vec[total_len] == 1) {
      return(.x)
    }
    # 计算末尾连续0的数量
    rle_res <- rle(outcome_vec)
    trailing_zero_cnt <- tail(rle_res$lengths, 1)
    # 计算需要保留的行数:总长度 - 末尾0数量 - 紧邻的1个1
    keep_row_cnt <- total_len - trailing_zero_cnt - 1
    # 边界处理:避免保留行数为负的异常
    if (keep_row_cnt <= 0) {
      return(.x[0, ])
    }
    # 返回前N行需要保留的观测
    return(.x[1:keep_row_cnt, ])
  }) %>%
  # 取消分组
  ungroup()

4. 结果验证

运行后df_result的输出完全符合预期:

  • 人员a保留1行outcome=1的观测
  • 人员b保留全部3行观测
  • 人员c保留1行outcome=1的观测

补充说明

该方案支持任意数量的人员分组,不需要针对单个人员手动调整,可直接复用在更大的数据集上。

内容的提问来源于stack exchange,提问作者user17047272

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:39:00