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

R语言如何为数据框新增列统计指定列各值的累计出现序号

R数据框生成累计出现序号并转宽表的最优实现

最优方案(tidyverse生态)

该方案代码简洁、可读性强,支持链式调用直接完成全流程需求,无需生成中间表:

library(tidyverse)

# 输入数据
my_df1 <- data.frame(col1 = c("A","D","B","E","A","G","G","E","G"),
                     col2 = c(1, 3, 5, 4, 3, 1, 1, 5, 5))

# 一步完成生成序号+宽表转换
my_df_wide <- my_df1 %>%
  group_by(col1) %>%
  mutate(col3 = row_number()) %>%
  ungroup() %>%
  pivot_wider(
    names_from = col3,
    names_prefix = "occurrence_",
    values_from = col2
  )

代码逻辑说明:

  • group_by(col1)按照指定列分组,用于统计每个值的出现次数
  • row_number()会为每个分组内的行按原始数据的顺序生成从1开始的递增序号,完全符合要求的累计出现次数规则,和SQL中的row_number窗口函数逻辑完全一致
  • 链式调用pivot_wider直接完成宽表转换,无需单独保存中间的my_df2表

如果需要单独保留带序号的中间表,只需要提前赋值即可:

my_df2 <- my_df1 %>%
  group_by(col1) %>%
  mutate(col3 = row_number()) %>%
  ungroup()

可选base R实现

如果不想加载第三方包,可以用base R的ave函数完成新增序号列的需求:

my_df1$col3 <- ave(seq(nrow(my_df1)), my_df1$col1, FUN = seq_along)
# 后续再调用tidyr的pivot_wider即可完成宽表转换

*注:示例宽表结果中出现的C行属于输入笔误,提供的原始输入数据中不存在C值,实际运行代码不会出现该行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:06:02