gpt4 book ai didi

R 条件分组行和组编号

转载 作者:行者123 更新时间:2023-12-04 11:00:47 28 4
gpt4 key购买 nike

我使用飞行运动的数据框(约 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)

标记(不)满足条件的所有行
df  <- mutate(df, CRIT = THR < 19)

通过以下,我设法有条件地“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

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

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

最佳答案

我不知道你真的可以避免创建 CRIT 的初步步骤,尽管我建议添加 cumsum创建它时,然后只需运行一个简单的 cumsum/diff总结一下。另外,如果您不需要不符合条件的组,最好分配 NA而不仅仅是一些随机数,例如零。这是一个可能的 data.table结束(此外,您根本不需要 df <- tbl_df(df) 步骤)

library(data.table)
setDT(df)[, CRIT := cumsum(THR < 19)]
df[THR >= 19, GRP := cumsum(c(0L, diff(CRIT)) != 0L) + 1L]
# THR CRIT GRP
# 1: 13 1 NA
# 2: 17 2 NA
# 3: 19 2 1
# 4: 22 2 1
# 5: 21 2 1
# 6: 19 2 1
# 7: 17 3 NA
# 8: 12 4 NA
# 9: 12 5 NA
# 10: 17 6 NA
# 11: 20 6 2
# 12: 20 6 2
# 13: 20 6 2
# 14: 17 7 NA
# 15: 17 8 NA
# 16: 13 9 NA
# 17: 20 9 3
# 18: 20 9 3
# 19: 17 10 NA
# 20: 13 11 NA

关于R 条件分组行和组编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32436963/

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