如何筛选保留符合条件的行及其下一行(若存在)
筛选满足条件的行及其下一行
需求:保留数据框中X3列取值为"NOK"的行,以及该行的下一行(若下一行存在)。
数据加载
首先加载你的数据:
df <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28), X1 = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A","A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A","A", "A", "A", "A"), X2 = c(0.41216973831289, 0.135689706939447,0.209457162385174, 0.309543570254728, 0.137749096959088, 0.573368605784345,0.428017532791265, 0.549909139998716, 0.409122667142699, 0.124117306710226,0.992993602943196, 0.613134107410448, 0.641394855265801, 0.622613385385378,0.828952257344686, 0.336949690008312, 0.858400408475689, 0.927912763348051,0.602819926298281, 0.309487756908737, 0.429053378531082, 0.515696657675126,0.792817566017885, 0.71207432761577, 0.829152651324837, 0.741688856317136,0.150579318070398, 0.585073373582262), X3 = c("OK", "NOK", "OK","OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "NOK","NOK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "NOK","OK", "NOK", "OK", "OK", "NOK")), row.names = c(NA, -28L), class = "data.frame")
方法一:Base R 实现
通过行索引筛选:
- 找到所有X3为"NOK"的行索引
- 补充这些索引的下一行(不超过数据总行数)
- 去重后提取对应行
# 获取NOK行的索引 nok_idx <- which(df$X3 == "NOK") # 合并NOK行和其下一行的索引,排除超过总行数的情况 keep_idx <- unique(c(nok_idx, pmin(nok_idx + 1, nrow(df)))) # 筛选数据 result_base <- df[keep_idx, ]
方法二:tidyverse (dplyr) 实现
利用lag()函数标记需要保留的行:当前行是NOK,或者上一行是NOK,即可保留。
library(dplyr) result_dplyr <- df %>% filter(X3 == "NOK" | lag(X3) == "NOK")
筛选结果
两种方法得到的结果一致,最终保留的关键行信息如下:
| ID | X1 | X3 |
|---|---|---|
| 2 | A | NOK |
| 3 | A | OK |
| 13 | A | NOK |
| 14 | A | NOK |
| 15 | A | OK |
| 23 | A | NOK |
| 24 | A | OK |
| 25 | A | NOK |
| 26 | A | OK |
| 28 | A | NOK |
内容的提问来源于stack exchange,提问作者AnonX
相关产品推荐
相关产品推荐

