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

如何为非连续重复分组生成递增的col2列?

问题解决方案

要生成符合要求的col2列,核心是识别col1中每个值的连续出现块,并为每个值的第n次连续块标记为n。以下是几种R语言实现方法:

方法1:使用dplyr包

library(dplyr)

# 示例数据
df <- structure(list(col1 = c("A", "A", "A", "A", "B", "B", "B", "C", 
"C", "C", "C", "A", "A", "E", "E", "E", "F", "F", "F", "G", "G", 
"G", "C", "C", "C", "A", "A", "A")), class = "data.frame", row.names = c(NA, 
-28L))

# 计算col2
df_result <- df %>%
  # 标记当前行与上一行col1是否不同(首次行默认与自身相同,不标记)
  mutate(change = col1 != lag(col1, default = first(col1))) %>%
  # 生成全局的连续序列ID,每次col1变化时ID+1
  mutate(seq_id = cumsum(change)) %>%
  # 按col1分组,对每个col1的序列ID进行密集排名,得到col2
  group_by(col1) %>%
  mutate(col2 = dense_rank(seq_id)) %>%
  ungroup() %>%
  # 移除中间辅助列
  select(-change, -seq_id)

# 查看结果
print(df_result)

方法2:使用data.table包

library(data.table)

setDT(df)
# 生成连续序列ID,再按col1分组计算各序列的出现次数
df[, seq_id := rleid(col1)][, col2 := match(seq_id, unique(seq_id)), by = col1][]

方法3:基础R实现

# 生成连续序列的标识ID
change <- c(FALSE, df$col1[-1] != df$col1[-nrow(df)])
seq_id <- cumsum(change) + 1

# 按col1分组,对每个值的序列ID进行匹配排名得到col2
df$col2 <- ave(seq_id, df$col1, FUN = function(x) match(x, unique(x)))

运行上述任意代码后,均可得到你期望的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:10:31