基于tidyverse按ID分组,根据index1条件生成index2字段
基于tidyverse的企鹅行为分组解决方案
我来帮你搞定这个按ID分组创建行为分组索引的问题。首先我会补全你给出的可复现代码,然后用tidyverse工具实现需求。
步骤1:构造可复现的示例数据
先补全你提到的数据框,模拟不同个体的行为序列,其中index1为TRUE代表潜水回合:
library(tidyverse) # 构造示例数据 df <- data.frame( ID = c(rep('A', 9), rep('B', 8)), behavior = c("游泳", "梳理", "潜水", "捕食", "休息", "潜水", "游泳", "潜水", "休息", "潜水", "捕食", "游泳", "潜水", "休息", "梳理", "潜水", "游泳"), index1 = c(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE) )
步骤2:按ID分组生成index2
核心思路是:给每个潜水回合分配递增的组号,然后将潜水之间的非潜水行为归到最近一次潜水的组中,同时处理开头可能存在的非潜水行为:
df_grouped <- df %>% group_by(ID) %>% mutate( # 给潜水回合分配组号,非潜水暂时设为NA index2 = ifelse(index1, cumsum(index1), NA), # 向下填充NA,让非潜水行为继承最近潜水的组号 index2 = fill(index2, .direction = "down") %>% pull(index2), # 处理每个ID开头的非潜水行为(如果有),统一归为第1组 index2 = ifelse(is.na(index2), 1, index2) ) %>% ungroup()
结果说明
运行后df_grouped的index2字段就实现了你的需求:
- 每个潜水回合及其之后到下一个潜水之前的所有行为,被归为同一个分组
- 同一个ID内的分组编号从1开始递增
- 开头的非潜水行为也会被纳入第一个分组(如果你想把这些单独设为组0,只需把代码里的
1改成0即可)
比如ID A的行为序列对应的分组:
| ID | behavior | index1 | index2 |
|---|---|---|---|
| A | 游泳 | FALSE | 1 |
| A | 梳理 | FALSE | 1 |
| A | 潜水 | TRUE | 1 |
| A | 捕食 | FALSE | 2 |
| A | 休息 | FALSE | 2 |
| A | 潜水 | TRUE | 2 |
| A | 游泳 | FALSE | 3 |
| A | 潜水 | TRUE | 3 |
| A | 休息 | FALSE | 3 |
内容的提问来源于stack exchange,提问作者Al Mac
相关产品推荐
相关产品推荐

