R语言筛选data frame指定值区间行 选select还是filter
问题解答
首先明确函数选择结论:
- 绝对不要用
select(),这个函数是用来选列、调整列顺序的,完全不处理行筛选逻辑,和你的需求不匹配。 - 行筛选场景可以用
filter(),但你要提取两个特定值之间的连续行,不能直接靠filter()加activity值判断(那样只会保留open和close两行,中间的行会被漏掉),需要先定位两个边界的行位置,再做范围筛选。
具体实现逻辑
核心思路是先找到activity列里第一个值为openwebsite的行号作为起始点,第一个值为closewebsite的行号作为结束点,提取两个行号之间的所有记录(包含首尾)即可。
示例代码
首先构造测试用的数据框:
df <- data.frame( Person = rep(1, 7), activity = c("write", "openwebsite", "paint", "write", "write", "closewebsite", "write"), duration = c(9,8,9,2,4,9,4) )
基础R写法(无需加载额外包)
# 定位起止行位置,加[1]是为了避免列中有重复匹配值时取错位置 start <- which(df$activity == "openwebsite")[1] end <- which(df$activity == "closewebsite")[1] # 按行索引切片提取 res <- df[start:end, ]
dplyr写法(用filter实现)
library(dplyr) res <- df %>% filter(between(row_number(), start, end))
运行后得到的结果和预期完全一致:
| Person | activity | duration |
|---|---|---|
| 1 | openwebsite | 8 |
| 1 | paint | 9 |
| 1 | write | 2 |
| 1 | write | 4 |
| 1 | closewebsite | 9 |
注意:如果你的数据里包含多个用户(Person)的行为记录,每个用户都有独立的open/closewebsite配对,只需要在定位行号前先按Person分组,分别取每个组内的起止位置即可。
内容的提问来源于stack exchange,提问作者marius89
相关产品推荐
相关产品推荐

