如何在 R 中添加标识连续日期的新列

问题描述 投票:0回答:1

我有一个与以下随机数据类似的数据框:

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 组中。

我需要将其推广到一个巨大的数据框,但格式相同。

最终输出(在此随机样本中)需要类似于:

谢谢!

r sorting date mutate formgroups
1个回答
0
投票

使用月差函数从这个答案,我们可以这样做:

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
© www.soinside.com 2019 - 2024. All rights reserved.