您可以使用以下的一些便利功能data.table
包裹:rleid
到“[生成游程类型组 ID”,以及shift
获取向量中焦点索引之前和之后的值。
library(data.table)
setDT(d)
d[ , r := rleid(activity)]
d[!(r %in% r[activity == "pt" & shift(activity, type = "lead") == "outside" |
shift(activity) == "outside" & activity == "pt"])]
# activity dist r
# 1: home 1 1
# 2: outside 5 3
# 3: outside 6 3
# 4: work 9 5
# 5: pt 10 6
# 6: pt 11 6
# 7: home 12 7
解释:
强迫你的data.frame
to a data.table
(setDT(d)
)。创建“活动”的游程长度索引(rleid
)。检查当前值是否为“pt”且下一个值是否为“outside”(activity == "pt" & shift(activity, type = "lead") == "outside"
), or (|
) 如果当前值为 'pt' 并且先前值为 'outside' (activity == "pt" & shift(activity) == "outside"
).
这个条件在哪里TRUE
,抓取要删除的运行组(r[<condition>]
)。检查运行是否在要删除的组中(r %in% <run groups to be removed>
)。如果是这样,请勿(!
)在索引数据时保留这些行(d[<condition>]
)
base
替代使用rle
.
“outside”之前或之后的“pt”运行值替换为NA
。 rle 被转换回向量 (inverse.rle
)和行NA
被删除(na.omit
).
显然,如果有行NA
在要保留的原始数据集中,需要使用另一个值进行替换。
with(rle(d$activity),
values[c(which(head(values, -1) == "pt" & tail(values, -1) == "outside"),
which(head(values, -1) == "outside" & tail(values, -1) == "pt") + 1)]) <- NA
d$activity = inverse.rle(r)
na.omit(d)