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

R语言:基于日期列生成指定格式的主键序列列

解决方案:为DataFrame生成按年月分组的自定义主键ID

没问题,作为R语言新手,这个需求其实用dplyr包就能轻松实现,我一步步给你讲清楚:

步骤1:准备示例数据(你可以直接替换成自己的my_data)

首先先构造和你描述一致的测试数据,方便你验证:

# 加载dplyr包(如果没安装先运行:install.packages("dplyr"))
library(dplyr)

# 构造示例DataFrame
my_data <- data.frame(
  Calendar_Day = as.Date(c("2018-03-31", "2018-03-31", "2018-03-31", 
                           "2019-01-31", "2019-01-31", "2019-10-31", 
                           "2018-03-31")),
  Name = c("ABC", "XYZ", "OPR", "ABC", "RTE", "YUD", "RYT"),
  stringsAsFactors = FALSE
)

步骤2:生成自定义ID列

核心思路是按年月分组,给每组内的行生成递增的6位序列号,再和年月拼接:

my_data_with_id <- my_data %>%
  # 提取年月字符串(格式:YYYYMM)
  mutate(year_month = format(Calendar_Day, "%Y%m")) %>%
  # 按年月分组
  group_by(year_month) %>%
  # 生成组内序列号,并用str_pad补前导零到6位
  mutate(sequence = str_pad(row_number(), width = 6, side = "left", pad = "0")) %>%
  # 拼接年月和序列号,得到最终ID
  mutate(ID = paste0(year_month, sequence)) %>%
  # 移除中间辅助列,保留需要的列
  select(Calendar_Day, Name, ID) %>%
  # 取消分组(可选,避免后续操作受分组影响)
  ungroup()

步骤3:查看结果

运行完上面的代码后,你可以打印my_data_with_id,得到的结果就是你想要的格式:

print(my_data_with_id)

输出结果:

Calendar_Day Name         ID
1   2018-03-31  ABC 201803000001
2   2018-03-31  XYZ 201803000002
3   2018-03-31  OPR 201803000003
4   2019-01-31  ABC 201901000001
5   2019-01-31  RTE 201901000002
6   2019-10-31  YUD 201910000001
7   2018-03-31  RYT 201803000004

关键函数解释

  • format(Calendar_Day, "%Y%m"): 把日期转换成YYYYMM格式的字符串,比如2018-03-31变成201803
  • group_by(year_month): 按年月分组,这样后续的序列号只在每组内递增
  • row_number(): 在分组内生成从1开始的递增序号
  • str_pad(..., width=6, pad="0"): 把序号补成6位,不足的地方用前导零填充,比如1变成000001
  • paste0(): 无缝拼接年月和序列号字符串,得到最终的ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:10:17