我使用飞行运动的数据框(约 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() 结果一致。
如果有人能对我有所了解,我将不胜感激。我无法在其他帖子中找到合适的解决方案。
你可以做:
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)