[英]Expand time interval data into days in R
假設我有這樣的數據:
interval_id indiv_id role start_date end_date
1 1 A 2006-05-01 2006-06-16
2 1 B 2006-06-16 2006-10-16
3 1 A 2006-10-16 2009-10-16
4 1 B 2009-10-16 2014-04-23
5 2 A 2007-12-15 2009-10-16
6 2 B 2009-10-16 2011-07-01
但我希望數據看起來像這樣(以第一個角色間隔為例):
interval_id indiv_id role day
1 1 A 2006-05-01
1 1 A 2006-05-02
1 1 A 2006-05-03
1 1 A 2006-05-04
1 1 A 2006-05-05
1 1 A 2006-05-06
... ... ... ...
1 1 A 2006-06-16
我正在用R中的循環這樣做。很確定這是不必要的。 有沒有像這樣擴展時間間隔的套餐? 看起來像一個重塑類型的工作,因為我將時間間隔轉換為長格式數據集。
謝謝。
這是數據表的一種方式(假設您的數據是df
)。
library(data.table)
dt <- data.table(df)
dt <- dt[,seq(as.Date(start_date),as.Date(end_date),by=1),
by=list(interval_id,indiv_id,role)]
setnames(dt,"V1","day")
head(dt)
# interval_id indiv_id role day
# 1: 1 1 A 2006-05-01
# 2: 1 1 A 2006-05-02
# 3: 1 1 A 2006-05-03
# 4: 1 1 A 2006-05-04
# 5: 1 1 A 2006-05-05
# 6: 1 1 A 2006-05-06
老學校(基地)R:
new.dat <- do.call("rbind", as.list(by(dat, dat[,1:3], function(x) {
return(data.frame(interval_id=x$interval_id,
ndiv_id=x$indiv_id,
role=x$role,
day=seq(as.Date(x$start_date), as.Date(x$end_date), by=1)))
})))
這是使用plyr
(再次假設您的數據是df
):
library(plyr)
byDay = ddply(df, .(interval_id, indiv_id, role), transform,
day=seq(as.Date(start_date), as.Date(end_date), by=1))
start_date和end_date值在每一行中重復,但您可以根據需要刪除它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.