在最大法术之间分配时间

Getting time spread between max spells

我有一个数据框如下,我想根据事件的最大传播创建一个时间传播变量。

 A<- c('1244', '1244', '1244', '1245', '1245', '1245', '1245', '1245', '1245', '1245')
 sequence<- c(1,1,0, 1,1,0,0,1,1,1)
 # 1= lived locally and 0 lived internationally 
 date<- c('19/Oct/12', '19/Oct/12', '20/Oct/12', '19/Oct/11', '19/Oct/11', '22/Nov/12', '24/Nov/12', '29/Nov/12','2/Dec/12', '29/Dec/12')

 df<- data.frame(A,sequence, date)

我想计算这些人在本地和国际上的最大时间分布。例如,如果我们看到 1244 she/he 人的序列为 110(即,他们在当地生活了两次,在国际上生活了 1 次,如果我们想计算 max_local_timespread= 0 天的时间差(这是最后日期 - 开始日期(因此,0 天 = 19/Oct/12-19/Oct/12)和 max_international_timespread= 0(20/Oct/12-20/Oct/12)

之间的差异

对于 1245 人来说,它是 1100111,所以他们在当地生活了两个法术,第一个法术是 11,第二个法术是 111。因为我想在这种情况下获得本地的最大时间差,所以它是时差在最后一个法术 111 的开始日期和结束日期之间。因此 max_local_timespread= 30 天 (29/Dec/12 -29/Nov/12) 和 max_international_timespread= 2 天 ('24/ Nov/12'-'22/Nov/12')

我期待如下输出:

A max_local max_international max_local_timespread max_international_timespread

   1244    2        1                  0                     0
   1245    3        2                  30                    2

关于如何实现这一点有什么建议吗?

您可以使用 dplyrdata.table 通过以下方式实现此目的:

df$date <- as.Date(df$date, "%d/%b/%y")

df <- df %>%
  group_by(A, sequence, rleid(sequence)) %>%
  mutate(max = n(),
         timespread = difftime(max(date), min(date), units = "days")) %>%
  ungroup() %>%
  group_by(A, sequence) %>%
  summarize(max = max(max),
            timespread = max(timespread)) %>%
  ungroup()


dcast(setDT(df), A~sequence, value.var = c("max", "timespread"))

结果如下table:

      A max_0 max_1 timespread_0 timespread_1
1: 1244     1     2       0 days       0 days
2: 1245     2     3       2 days      30 days

一个data.table备选方案:

library(data.table)

dt <- data.table(A,sequence, date)

dt[, date := as.Date(date, format = "%d/%b/%y")]

dt <- dt[, .(max = .N, timespread = difftime(max(date), min(date), units = "days")), by=.(A, sequence, rleid(sequence))]
dt <- dt[, .(max = max(max), timespread = max(timespread)), by=.(A, sequence)]

dcast(dt, A~sequence, value.var = c("max", "timespread"))