如何在R语言的data.frame中筛选KV之后到NULL前的观测值
筛选R数据框中KV与后续第一个NULL之间的观测值
原始数据
现有如下data.frame:
| Type | Number |
|---|---|
| a | 34445 |
| b | 35485 |
| KV | 54721 |
| c | 23456 |
| d | 79498 |
| NULL | NULL |
| a | 34445 |
| b | 71458 |
| KV | 23456 |
| c | 45689 |
| d | 84792 |
| NULL | NULL |
需求
筛选出Type为KV的观测值之后的所有行,遇到Type为NULL时停止(不包含NULL行),即获取每个KV与其后第一个NULL之间的观测值。
预期结果
最终需要得到如下数据:
| Type | Number |
|---|---|
| c | 23456 |
| d | 79498 |
| c | 45689 |
| d | 84792 |
尝试过的代码
subset(df, c(tail(Type, 1:2) == 'Key Value', TRUE))
解决方案
方法1:Base R实现
通过生成分组标识定位目标区间:
# 为每个KV起始的区块生成分组编号 df$group <- cumsum(df$Type == "KV") # 筛选符合条件的行,排除KV和NULL本身 result <- df[df$group > 0 & df$Type != "KV" & df$Type != "NULL", c("Type", "Number")]
方法2:dplyr包实现
借助管道语法更直观完成筛选:
library(dplyr) result <- df %>% # 标记每个KV对应的区块 mutate(block = cumsum(Type == "KV")) %>% # 筛选区块内、非KV且非NULL的行 filter(block > 0, Type != "KV", Type != "NULL") %>% # 保留需要的列 select(Type, Number)
两种方法都能准确提取出每个KV到下一个NULL之间的观测值,得到预期结果。
内容的提问来源于stack exchange,提问作者Victor Hugo Schieck Terziani
相关产品推荐
相关产品推荐

