You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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的行为序列对应的分组:

IDbehaviorindex1index2
A游泳FALSE1
A梳理FALSE1
A潜水TRUE1
A捕食FALSE2
A休息FALSE2
A潜水TRUE2
A游泳FALSE3
A潜水TRUE3
A休息FALSE3

内容的提问来源于stack exchange,提问作者Al Mac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:25:21