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变成201803group_by(year_month): 按年月分组,这样后续的序列号只在每组内递增row_number(): 在分组内生成从1开始的递增序号str_pad(..., width=6, pad="0"): 把序号补成6位,不足的地方用前导零填充,比如1变成000001paste0(): 无缝拼接年月和序列号字符串,得到最终的ID
内容的提问来源于stack exchange,提问作者AGRAWSAU
相关产品推荐
相关产品推荐

