【问题标题】:Calculate difference where numid is the same between datasets of differing length计算不同长度的数据集之间 numid 相同的差异
【发布时间】:2014-01-14 17:37:04
【问题描述】:

我有 2 个数据框:“start.date”和“death.date”。每个包括 2 列“numid”(一个数字 id)和一个“date”列。 “start.date”是记录每个 numid 疾病开始的数据集。 "death.date" 仅包括 "start.date" 中在 death.date$date 中的日期死亡的那些 numid。

我需要计算那些具有相同 numid 的 start.date 和 death.date 之间的差异(=survival)。

这是我写的:

 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] 的最后一个值,但我找不到出路。任何人都可以对此有所了解吗? 可能有更简单的方法可以做到这一点(运行速度非常慢 - 即使结果错误)

抱歉,如果在某处讨论过这个问题,我只是找不到任何适用于我的数据的东西。

干杯 马可

【问题讨论】:

    标签: r for-loop compare


    【解决方案1】:

    这是我的尝试,使用自定义函数生成日期,然后创建两个 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])
    

    【讨论】:

    • 感谢@Infominer 的建议。我最初使用 %in% 但无法使其在这种情况下工作,但最终您的代码对我有用。一个如果问题是即使我在原始数据集中将日期指定为.POSIXct,然后当我使用 cbind 合并原始数据集之间的这些日期列时,R 会将这些日期重新转换为数字(不知道为什么)。因此,我首先使用日期 as.character() 对列进行 cbind,然后在使用 difftime() 之前将日期转换为 as.POSIXct() 来解决这个问题。感谢您的帮助!
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2023-01-07
    • 2021-07-07
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多