我有一个如下的数据帧,并想创建一个基于事件最大扩散的时间扩散变量。
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她/他有序列110 (即,他们在本地和国际上分别生活在两个法术和一个国际法术中,如果我们想要计算所有法术中的avg_local_timespread=总时间/法术中的事件计数为0day/2(这是最后日期开始日期(因此,0 days= 19/Oct/12-19/Oct/12)和avg_international_timespread= 0/1=0 (20/Oct/12-20/Oct/12)之间的差异)
对于1245人来说是1100111,所以他们在当地生活了两个法术,第一个法术是11,第二个法术是111。因为我想要得到本地的平均时间分布,在这种情况下,它是第一个法术(11)+最后一个法术(111)/total法术(5)的开始日期和结束日期之间的时间差。因此avg_local_timespread= 6天(30+0)/5和avg_international_timespread= 1天(2/2)(‘24/11/12’-‘22/11/12’)
我期望得到如下输出:
A avg_local_timespread avg_international_timespread total_local_timespread
1244 0 0 0
1245 6 1 30
total_international_timespread
1244 0
1245 2发布于 2021-11-02 12:24:48
我无法复制您所需的输出,因为我不理解您在问题中提供的计算。但我相信这会让你开始。
library(data.table)
library(lubridate)
# convert to data.table format
setDT(df)
# convert dates to date-format
df[, date := lubridate::dmy(date, locale = "English_United States")]
# create sequence-groups by A
df[, seq_group := rleid(sequence == 1), by = .(A)][]
# summarise
ans <- df[, .(start = min(date), end = max(date)), by = .(A, seq_group, sequence)]
# add diration of spell
ans[, duration := end - start]
# A seq_group sequence start end duration
# 1: 1244 1 1 2012-10-19 2012-10-19 0 days
# 2: 1244 2 0 2012-10-20 2012-10-20 0 days
# 3: 1245 1 1 2011-10-19 2011-10-19 0 days
# 4: 1245 2 0 2012-11-22 2012-11-24 2 days
# 5: 1245 3 1 2012-11-29 2012-12-29 30 dayshttps://stackoverflow.com/questions/69808738
复制相似问题