【问题标题】:Selecting a row based on the properties of the row before根据前一行的属性选择一行
【发布时间】:2013-12-05 12:26:33
【问题描述】:

我有以下数据框:

hospNo <- as.character(seq(1:10))
patID <- c("1","2","2","2","2","3","4","4","4","4")
admissionType <- c("chronic", "acute", "chronic", "chronic", "chronic", "acute",   "acute", "chronic", "chronic", "chronic")
dischargeDate <- c("20110101", "20100101", "20100106", "20100120", "20100314", "20120607", "20120329", "20120402", "20120408","20120421")

HospData <- cbind(hospNo,patID,admissionType,dischargeDate)
HospData <- data.frame(HospData)

我想选择患者 (patID) 在再次急性入院(出院日期)后 14 天内(慢性)要去的每一行(住院编号)。

本例中的解决方案是长期住院:3、8 和 9。

有没有办法做到这一点? 我知道如何通过 as.Date ("%Y%m%d") 更改日期,但我发布了我的原始数据,因为可能有更好的计算方法。

我们将不胜感激!

【问题讨论】:

标签: r date dataframe row


【解决方案1】:
> library(zoo)
> library(plyr)

> HospData$dischargeDate <- as.Date(HospData$dischargeDate, format = "%Y%m%d")
> out <- ddply(HospData, .(patID), function(x) {
    lastAcuteDischarge <- ifelse(x$admissionType == "acute", x$dischargeDate, NA)
    lastAcuteDischarge <- na.locf(lastAcuteDischarge, na.rm = FALSE)
    x[x$admissionType == "chronic" & x$dischargeDate - lastAcuteDischarge < 14,]
})
> out[complete.cases(out),]
#  hospNo patID admissionType dischargeDate
# 2      3     2       chronic    2010-01-06
# 3      8     4       chronic    2012-04-02
# 4      9     4       chronic    2012-04-08

【讨论】:

    【解决方案2】:

    试试这个:

    #data
    hospNo <- as.character(seq(1:10))
    patID <- c("1","2","2","2","2","3","4","4","4","4")
    admissionType <- c("chronic", "acute", "chronic", "chronic", "chronic", "acute",   "acute", "chronic", "chronic", "chronic")
    dischargeDate <- c("20110101", "20100101", "20100106", "20100120", "20100314", "20120607", "20120329", "20120402", "20120408","20120421")
    HospData <- cbind(hospNo,patID,admissionType,dischargeDate)
    HospData <- data.frame(HospData)
    
    #merge to have acute and chronic dischargeDate on same row
    HospData1 <- merge(HospData,
                       HospData[ HospData$admissionType=="acute",c("patID","dischargeDate")],
                       by="patID", all.x=T)
    HospData1 <- HospData1[ HospData1$admissionType=="chronic" & 
                              !is.na(HospData1$dischargeDate.y),]
    #calculate duration
    HospData1$duration <- 
      as.Date(HospData1$dischargeDate.x,"%Y%m%d")-
      as.Date(HospData1$dischargeDate.y,"%Y%m%d")
    
    #subset where within 14 days
    HospData1[ HospData1$duration <15,]
    #     patID hospNo admissionType dischargeDate.x dischargeDate.y duration
    # 3     2      3       chronic        20100106        20100101   5 days
    # 8     4      8       chronic        20120402        20120329   4 days
    # 9     4      9       chronic        20120408        20120329  10 days
    

    【讨论】:

    • 谢谢!我正在寻找“慢性”患者的入院情况。对不起,我的问题好像写得不清楚!我检查了一下,也许我仍然可以使用你的解决方案。
    • 谢谢!你们太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多