2014-01-14 22 views
1

我有2個數據框:「start.date」和「death.date」。每個包括2列「numid」(數字ID)和「日期」列。 「start.date」是記錄每個numid的疾病開始的數據集。 「death.date」僅包含那些在death.date $ date中死亡的「start.date」中的numid。計算不同長度的數據集中numid相同的差異

我需要爲具有相同numid的人計算start.date和death.date之間的差異(=存活率)。

這是我寫的:

tempi<-as.numeric(factor(start.date$numid)) 
tempj<-as.numeric(factor(death.date$numid)) 
for(i in tempi){ 
    for(j in tempj){ 
    surviv[i]<-ifelse(colic.date$numid[i]==death.date$numid[j], 
         death.date$date.death[j]-colic.date$date.colic[i], 
         "alive") 
    } 
} 

在這裏我的問題,我認爲是surviv [I]只保留death.date $ numid [J]的最後一個值,但我不能找到出路。任何人都可以點亮這一點嗎? 有可能更簡單的方法來做到這一點(它運行速度非常慢 - 即使有錯誤的結果)

道歉,如果這已被討論的地方,我什麼都找不到我的數據。

乾杯 馬爾科

回答

0

這是我在它刺傷,使用自定義函數生成日期,然後創建了兩個data.frames。然後我使用intersect找到了data.frames之間的common.ids,並使用difftime來查找日期的差異。你使用for循環時,你的代碼很慢。閱讀this page上的資源,用於向量化代碼。

我用intersect,雖然看看%in%以及找到共同的項目。

#Function to get some dates, using a uniform distribution, 
thanks to [Dirk Eddelbuettel][2] 
unif.dates <-function(N, start = "2012/01/01", end = "2012/12/31") { 
#Orginal at http://stackoverflow.com/a/14721124/2747709 
start <- as.POSIXct(as.Date(start))# 
end <- as.POSIXct(as.Date(end))# 
dt <- as.numeric(difftime(end,start,unit = "sec"))# 
ev <- sort(runif(N, 0, dt))# 
rt <- start + ev 
} 
#Generating some random ids and dates and 
assigning them to data.frames 

start.date <- data.frame(numid = sample(25,15), date = unif.dates(15, start = "2012/06/01", end = "2012/12/31")) 

death.date <- data.frame(numid = sample(25,15),date = unif.dates(15, start = "2012/08/01", 
end = "2013/02/28")) 
#Get Common ids between data.frames 
common.ids <-intersect(death.date$numid,start.date$numid) 
#Calculate time difference, this defauts to days, read ?difftime for other units 
z <-difftime(death.date$date[death.date$numid %in% common.ids], start.date$date[start.date$numid %in% common.ids]) 
+0

謝謝@Infominer的建議。我最初在%中使用%,但無法在此實例中使用它,但最終您的代碼爲我工作。如果問題是,即使我已經在原始數據集中指定日期爲.POSIXct,那麼當我使用cbind在原始數據集之間合併這些日期列時,R會將這些日期重新轉換爲數字(不知道爲什麼)。因此,我通過首先將日期as.character()與cbind綁定在一起,然後在使用difftime()之前將日期轉換爲as.POSIXct()。謝謝你的幫助! – MarcoD

相關問題