如何在data.frame中添加标识连续日期组的列
解决R语言中为data.frame添加连续日期分组列的问题
要实现为数据框添加连续日期分组列的需求,核心是先完成日期格式转换,再按分组逻辑生成连续日期的标识,具体操作如下:
1. 日期格式转换
原数据中的date_collection是dd/mm/yyyy格式的字符串,需要转为R可识别的日期类型,两种实现方式任选:
基础R方法
mydf$date_collection <- as.Date(mydf$date_collection, format = "%d/%m/%Y")
lubridate包简化写法
用lubridate包的dmy()函数可以自动识别日/月/年格式,更便捷:
library(lubridate) mydf$date_collection <- dmy(mydf$date_collection)
2. 按分组生成连续日期标识
按var_name分组后,判断相邻日期的间隔,当间隔大于1天时标记为新分组,最终累加得到分组ID。这里用dplyr包实现分组操作:
library(dplyr) mydf <- mydf %>% arrange(var_name, date_collection) %>% # 先按分组和日期排序 group_by(var_name) %>% mutate( # 计算当前日期与上一条日期的差值,第一条数据差值设为0 date_diff = c(0, diff(date_collection)), # 差值大于1时触发新分组,累加生成分组ID group_id = cumsum(date_diff > 1) + 1 ) %>% ungroup()
完整可运行代码
library(dplyr) library(lubridate) # 原始数据 mydf <- data.frame( var_name = c(rep("toto",6),rep("titi",5)), date_collection = c("09/12/2022","10/12/2022","13/12/2022","16/12/2022","16/12/2022","17/12/2022", "01/12/2022","03/11/2022","04/11/2022","05/11/2022","08/11/2022") ) # 转换日期格式 mydf$date_collection <- dmy(mydf$date_collection) # 生成连续日期分组 mydf <- mydf %>% arrange(var_name, date_collection) %>% group_by(var_name) %>% mutate( date_diff = c(0, diff(date_collection)), group_id = cumsum(date_diff > 1) + 1 ) %>% ungroup() # 查看结果 print(mydf)
运行后生成的group_id列就是所需的连续日期分组标识,完全匹配你给出的预期输出。
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

