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

如何在R语言DataFrame中按分组规则生成分类列?

按分组生成category列的R语言实现

原始数据

group1 <- c('A','A','A','A',
            'B','B','B','B',
            'C','C','C','C')

group2 <- c(1, 2, 3, 4,
            1, 2, 3, 4,
            1, 2, 3, 4)

indicator <- c(1, 1, 1, 1,
               1, 1, NA, 1,
               NA, 1, 1, NA)

df <- data.frame(group1, group2, indicator)

需求说明

按group1分组,对每组内的indicator值生成新列category,规则如下:

  • 分组内第一个1标记为"New"
  • NA之后的第一个1标记为"Return"
  • 其余所有1标记为"Normal"
  • 所有NA标记为"None"

实现代码

可以用dplyr结合行内逻辑判断实现,代码如下:

library(dplyr)

df_result <- df %>%
  group_by(group1) %>%
  mutate(
    # 先标记NA的情况
    category = case_when(
      is.na(indicator) ~ "None",
      TRUE ~ NA_character_
    ),
    # 标记所有"新段落"的第一个1:包括分组开头的第一个1、NA之后的第一个1
    flag = cumsum(!is.na(indicator)) != lag(cumsum(!is.na(indicator)), default = 0) & indicator == 1
  ) %>%
  mutate(
    category = case_when(
      is.na(indicator) ~ "None",
      flag & row_number() == which(indicator == 1)[1] ~ "New",
      flag & row_number() != which(indicator == 1)[1] ~ "Return",
      indicator == 1 ~ "Normal"
    )
  ) %>%
  select(-flag) %>% # 移除辅助列
  ungroup()

print(df_result)

代码逻辑解释

  1. 按group1分组后,先通过case_when把所有NA值标记为"None"
  2. 生成辅助列flag:用cumsum(!is.na(indicator))统计非NA值的累计次数,当累计次数发生变化且当前值为1时,说明这是一段连续非NA中的第一个1(覆盖分组开头的第一个1、NA之后的第一个1两种场景)
  3. 再次用case_when细化标记:
    • 保留NA的"None"标记
    • flag为TRUE且是分组内第一个1的,标记为"New"
    • 其他flag为TRUE的1,标记为"Return"
    • 剩余的1统一标记为"Normal"
  4. 最后移除辅助列并取消分组

运行代码后即可得到期望的结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:43:25