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
相关产品推荐
相关产品推荐

