2014-01-14 2 views
1

2 개의 데이터 프레임 "start.date"및 "death.date"가 있습니다. 각각은 2 개의 열 "numid"(숫자 ID)와 "날짜"열을 포함합니다. "start.date"는 각 numid에 대한 질병 시작을 기록하는 데이터 세트입니다. "death.date"에는 "start.date"에 numid 인 사람 만 포함되며이 날짜는 death.date $ date의 날짜에 사망합니다.다른 길이의 데이터 세트간에 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 중 [내가]은 death.date $ numid [J]의 마지막 값을 유지하지만 난 방법을 찾을 수있다 :

은 내가 쓴 것입니다 . 누가이 빛을 밝힐 수 있니? 아마도 더 쉬운 방법이 있습니다 (매우 느리게 실행됩니다 - 잘못된 결과에도 불구하고)

어쨌든 제가 사과했는데 내 데이터로는 아무 것도 찾을 수 없었습니다.

건배 마르코

답변

0

여기에 날짜를 생성 한 후이 data.frames을 생성하는 사용자 정의 기능을 사용하여, 그것은 나의 자상입니다. 그런 다음 intersect을 사용하여 data.frames 사이에 common.ids가 발견되었고 difftime을 사용하여 날짜의 차이를 확인했습니다. for 루프를 사용할 때 코드가 느립니다. 코드 벡터화에 대한 내용은 this page을 참조하십시오.

나는 %in%을 보았지만 공통 항목을 찾았지만 intersect을 사용했습니다.

#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를 지정한 후에도 R이 원본 데이터 셋 사이의 날짜 열을 병합하기 위해 cbind를 사용할 때 R이 이들을 숫자로 재 변환했습니다. 이유는 확실하지 않습니다. 그래서 나는 먼저 as.character()라는 날짜를 가진 열을 cbinding 한 다음 difftime()을 사용하기 직전에 as.POSIXct()로 날짜를 변환했다. 당신의 도움을 주셔서 감사합니다! – MarcoD

관련 문제