在最大法术之间分配时间
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
关于如何实现这一点有什么建议吗?
您可以使用 dplyr
和 data.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"))
我有一个数据框如下,我想根据事件的最大传播创建一个时间传播变量。
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
关于如何实现这一点有什么建议吗?
您可以使用 dplyr
和 data.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"))