我有 2 个数据框:"start.date" 和 "death.date"。每个都包括 2 列"numid"(数字 id)和一个"日期"列。"Start.Date"是一个数据集,记录每个Numid的疾病开始。"death.date"仅包括"start.date"中那些在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[i]只保留了death.date$numid[j]的最后一个值,但我找不到出路。请问任何人都可以对此有所了解吗?可能有更简单的方法可以做到这一点(它运行得很慢 - 即使结果错误)
抱歉,如果在某处讨论过这个问题,我只是找不到任何适用于我的数据的内容。
干杯马可
尝试,使用自定义函数生成日期,然后创建两个 data.frames。然后,我使用 intersect
在数据帧之间找到了 common.id,并使用difftime
来查找日期的差异。您的代码很慢,因为您使用 for 循环。阅读此页面上的资源,了解如何对代码进行矢量化。
我用过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])