R语言如何删除数据框中后行同为FAILURE的指定行
R语言实现指定列连续FAILURE行过滤
核心判断逻辑
要删除「取值为"FAILURE"且下一行同样为"FAILURE"」的行,核心是构造和目标列等长的下一行取值向量:把目标列整体向前偏移一位,最后一位填充非"FAILURE"的占位值,逐行做逻辑判断即可。
连续多个"FAILURE"的场景下,这个逻辑会自动保留连续段最后一个"FAILURE"(因为它的下一行是"HIT",不满足删除条件),和给出的预期输出完全匹配。
代码实现
1. 原始向量效果验证
# 输入原始序列 raw_vec <- c("FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "FAILURE", "HIT", "FAILURE", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "FAILURE", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "HIT", "FAILURE", "FAILURE", "FAILURE", "HIT") # 构造下一行取值向量,最后一位填充非FAILURE占位值,避免最后一行被误删 next_val <- c(raw_vec[-1], "END") # 过滤掉符合删除条件的条目 result_vec <- raw_vec[!(raw_vec == "FAILURE" & next_val == "FAILURE")]
运行后result_vec的输出和预期序列完全一致。
2. 数据框场景:基础R实现
假设数据框名为df,需要过滤的目标列名为status:
# 新增临时列存储下一行的取值 df$next_status <- c(df$status[-1], "") # 执行行过滤 df_filtered <- df[!(df$status == "FAILURE" & df$next_status == "FAILURE"), ] # 删除临时列 df_filtered$next_status <- NULL
3. 数据框场景:dplyr实现
如果使用tidyverse生态的dplyr包,可以用lead()函数直接取后行值,写法更简洁:
library(dplyr) df_filtered <- df %>% # lead()取后一行值,最后一行用空字符串作为默认值 mutate(next_status = lead(status, default = "")) %>% # 过滤掉符合删除条件的行 filter(!(status == "FAILURE" & next_status == "FAILURE")) %>% # 移除临时构造的列 select(-next_status)
注意事项
- 最后一行的下一行占位值不要设为"FAILURE",否则最后一行如果是"FAILURE"会被误删
- 该逻辑为向量化运算,执行效率很高,即使是百万行级别的数据也能快速处理
内容的提问来源于stack exchange,提问作者Sophie S
相关产品推荐
相关产品推荐

