gpt4 book ai didi

r - 在特定值之前和之后删除特定值的运行

转载 作者:行者123 更新时间:2023-12-04 09:38:09 29 4
gpt4 key购买 nike

我有一个包含几列的数据框。基于“事件”列,我想删除特定值“pt”的整个连续运行,但仅当它们发生在“外部”运行之前或之后。

在下面的简化数据中,有一个运行,其中“事件”是“外部”,并且前后都有“pt”块。这两个“pt”块应该被删除。

   activity dist
1 home 1
2 pt 2 # <- run of 'pt' before run of 'outside': remove
3 pt 3 # <-
4 pt 4 # <-
5 outside 5
6 outside 6
7 pt 7 # <- run of 'pt' after run of 'outside': remove
8 pt 8 # <-
9 work 9
10 pt 10
11 pt 11
12 home 12

因此,所需的输出是:
    activity dist 
1 home 1
2 outside 5
3 outside 6
4 work 9
5 pt 10
6 pt 11
7 home 12

如何做到这一点?
dput数据的:
structure(list(activity = c("home", "pt", "pt", "pt", "outside", "outside", "pt", "pt", "work", "pt", "pt", "home"),
dist = 1:12),
class = "data.frame", row.names = c(NA, -12L))

最佳答案

您可以使用来自 data.table 的一些便利功能包裹:rleid到“[g] 生成运行长度类型组 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.framedata.table ( setDT(d) )。创建“事件”的运行长度索引 ( rleid )。检查当前值是否为 'pt' 且下一个值是否为 'outside' ( activity == "pt" & shift(activity, type = "lead") == "outside" ),或者 ( | ) 如果当前值为 'pt' 且前一个值为 'outside' ( activity == "pt" & shift(activity) == "outside" )。
这个条件是 TRUE , 获取要删除的运行组 ( r[<condition>] )。检查 run 是否在要删除的组中( 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)

关于r - 在特定值之前和之后删除特定值的运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62454188/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com