我有一个与以下随机数据类似的数据框:
data<- data.frame(
id = c('TEC', 'TEC', 'TEC', 'TEC', 'FIL', 'FIL', 'FIL'),
date = c('2009-10', '2009-11', '2009-12', '2010-04', '2000-05', '2006-10', '2006-11')
)
data$date <- ym(data$date)
set.seed(123)
data$re <- sample(1:100, nrow(data), replace = TRUE)
现在,我需要创建一个新列,我们必须在其中根据组放置数字。我的意思是,首先,我需要按 id 分组。然后,在每个 id 中,我需要根据连续日期进行分组。例如,在此示例中,第一个 id=TEC 的第一个日期是 2009-10,第二个日期是连续的(逐月)2009-11,第三个日期也是连续的,但是第四个日期不连续。所以我需要将前三个观察值放入第 1 组,将第四个观察值放入第 2 组。然后,使用下一个 id (FIL)。第一个观察需要在第 1 组中,第二个日期和第三个日期是连续的,因此在第 2 组中。
我需要将其推广到一个巨大的数据框,但格式相同。
最终输出(在此随机样本中)需要类似于:
谢谢!
使用月差函数从这个答案,我们可以这样做:
monnb <- function(d) { lt <- as.POSIXlt(as.Date(d, origin="1900-01-01"));
lt$year*12 + lt$mon }
mondf <- function(d1, d2) { monnb(d2) - monnb(d1) }
data |>
mutate(
group = consecutive_id(mondf(min(date), date) - row_number()),
.by = id
)
# id date re group
# 1 TEC 2009-10-01 31 1
# 2 TEC 2009-11-01 79 1
# 3 TEC 2009-12-01 51 1
# 4 TEC 2010-04-01 14 2
# 5 FIL 2000-05-01 67 1
# 6 FIL 2006-10-01 42 2
# 7 FIL 2006-11-01 50 2