[英]How to calculate duration from monthly enrollment data?
我試圖每月獲取有關不同程序注冊的數據,並將其轉換為每個“ idnum”的持續時間/咒語。 例如:
row idnum date program
1 00001 201301 1
2 00001 201302 1
3 00001 201303 1
4 00001 201306 1
5 00001 201307 1
6 00002 201301 1
7 00002 201302 1
8 00002 201304 1
9 00002 201305 1
10 00002 201307 1
11 00002 201308 1
從201301到201303(歷時3個月)和201306到201307(歷時2個月)將“ idnum” 00001納入程序“ 1”。
從2013年1月至201302年(2個月),201304年至201305年(2個月)和201307年至201308年(2個月),“ idnum” 00002進入程序“ 1”。
我想得到的結果類似於以下內容:
idnum program start duration
00001 1 201301 3
00001 1 201306 2
00002 1 201301 2
00002 1 201304 2
00002 1 201307 2
任何幫助將不勝感激! 預先感謝您的建議。
當嘗試比較不同的行時,我喜歡使用data.table
包。
require("data.table")
#Create fake data
data <- data.table(row=1:11,idnum=c(rep("00001",5),rep("00002",6)),
date=c(201301:201303,201306:201307,201301:201302,201304:201305,201307:201308),program=1)
#Develop order by id
data[,order:=seq(1,.N),by="idnum"]
#Calculate date difference within each id for each date
data[,date.diff:=(date[order+1]-date[order]),by="idnum"]
#Lag date diff
data[,date.diff2:=c(NA,date.diff[-.N])]
data[is.na(date.diff2),date.diff2:=0]
#Develop new start variable to account for interuptions within id
data[,new.start:=1*(date.diff2>1)]
data[,start.group:=cumsum(new.start)]
#Develop result
result <- data[,list(idnum=idnum[1],program=program[1],start=date[1],duration=(date[.N]-date[1]+1)),
by=c("idnum","start.group")]
result
idnum start.group idnum program start duration
1: 00001 0 00001 1 201301 3
2: 00001 1 00001 1 201306 2
3: 00002 1 00002 1 201301 2
4: 00002 2 00002 1 201304 2
5: 00002 3 00002 1 201307 2
在base R中通過不同的函數進行匯總並不是一件容易的事,而且您的日期值也很容易找到這種形式的差距,但這是一種策略
#helper function to convert date to continuous integer
tomonthseq<-function(x) {
x<-as.character(x)
yr<-as.numeric(substr(x,1,4))
mo<-as.numeric(substr(x,5,6))
ryr<-min(yr)
mo+(yr-ryr)*12
}
#find ID for each id/prog/date seq
sq<-with(dd,ave(tomonthseq(as.character(date)), idnum, program, FUN=function(x) {
cumsum(c(0, diff(x)!=1))
}))
#do the aggregation
xx <- aggregate(date~sq+program+idnum, dd,
function(x) {cbind(x[1], length(x))})
#clean up after aggregation mess
xx <- cbind(xx[, 3:2],
structure(xx[, 4], .Dimnames=list(NULL, c("start","duration"))))
輸出是
idnum program start duration
1 00001 1 201301 3
2 00001 1 201306 2
3 00002 1 201301 2
4 00002 1 201304 2
5 00002 1 201307 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.