R 条件分组行和组编号

Rai*_*ner 5 grouping r

我使用飞行运动的数据框(约 100 万行 * 108 个变量),并希望对满足特定标准(即特定变量的值)的阶段进行分组。为了识别这些群体,我想对它们进行编号。作为 R 新手,我让它适用于我的案例。现在我正在寻找一种更优雅的方式。特别是,我想克服组编号中的“无用”差距。我提供了一个简化的 dplyr 数据框示例,其中阈值标准的值为 THR。行按时间戳排序(因此,我可以在这里截断它)。

THR <- c(13,17,19,22,21,19,17,12,12,17,20,20,20,17,17,13, 20,20,17,13)
df  <- as.data.frame(THR)
df  <- tbl_df(df)
Run Code Online (Sandbox Code Playgroud)

标记(不)满足条件的所有行

df  <- mutate(df, CRIT = THR < 19)
Run Code Online (Sandbox Code Playgroud)

通过以下,我设法有条件地“cumsum”以获得唯一的组标识:

df <- mutate(df, GRP = ifelse(CRIT == 1, 0, cumsum(CRIT))
df
    x CRIT GRP
1  13 TRUE   0
2  17 TRUE   0
3  19 FALSE  2          
4  22 FALSE  2
5  21 FALSE  2
6  19 FALSE  2
7  17 TRUE   0
8  12 TRUE   0
9  12 TRUE   0
10 17 TRUE   0
11 20 FALSE  6
12 20 FALSE  6
Run Code Online (Sandbox Code Playgroud)

虽然这可以解决问题,并且我可以使用 group_by(例如汇总、过滤器)对组进行操作,但从示例输出中可以看出,编号并不理想。在此示例中,第 1 组编号为 2,第 2 组编号为 6,这与 cumsum() 结果一致。

如果有人能对我有所了解,我将不胜感激。我无法在其他帖子中找到合适的解决方案。

Col*_*vel 0

你可以做:

 x = rle(df$CRIT)
 mask = x$values
 x$values[mask] = 0
 x$values[!mask] = cumsum(!x$values[!mask])

 mutate(df, GRP=inverse.rle(x))

#   THR  CRIT GRP
#1   13  TRUE   0
#2   17  TRUE   0
#3   19 FALSE   1
#4   22 FALSE   1
#5   21 FALSE   1
#6   19 FALSE   1
#7   17  TRUE   0
#8   12  TRUE   0
#9   12  TRUE   0
#10  17  TRUE   0
#11  20 FALSE   2
#12  20 FALSE   2
#13  20 FALSE   2
#14  17  TRUE   0
#15  17  TRUE   0
#16  13  TRUE   0
#17  20 FALSE   3
#18  20 FALSE   3
#19  17  TRUE   0
#20  13  TRUE   0
Run Code Online (Sandbox Code Playgroud)