【问题标题】:Calculate readmission rate计算再入院率
【发布时间】:2017-06-12 20:56:47
【问题描述】:

我正在尝试计算 2015 年到急诊科 (ED) 就诊的患者的 30 天和 180 天再入院率,但我不太确定该怎么做。

我的数据框看起来像这样:

Visit # |Patient # | Admission Date | Discharge date
   1       1         2015/01/01        2015/01/02
   2       2         2015/01/01        2015/01/01         
   3       3         2015/01/01        2015/01/02
   4       1         2015/01/09        2015/01/09                                       
   5       2         2015/04/01        2015/04/05
   6       1         2015/05/01        2015/05/01

我希望有两个额外的列,其中包含一个二进制变量 [0,1],指示患者是否在 30 天和/或 60 天内重新入院。 在上面的例子中,患者 1 来 ED 3 次,1 月 2 次,5 月再次,因此我希望 readmit30 = 1 和 readmit180 = 1。患者 2 来 2 次,一次在 1 月,一次在 4 月,因此 readmit30 = 0 和 readmit60 = 1。 示例解决方案:

Visit # |Patient #| Admission Date | Discharge date | readmit30 | readmit180
   1       1        2015/01/01        2015/01/02        1          1
   2       2        2015/01/01        2015/01/01        0          1 
   3       3        2015/01/01        2015/01/02        0          0
   4       1        2015/01/09        2015/01/09        1          1                               
   5       2        2015/04/01        2015/04/05        0          1
   6       1        2015/05/01        2015/05/01        1          1

我的数据集有大约 2000 次访问,大约有 1500 名患者。 任何帮助表示赞赏。

谢谢!

【问题讨论】:

  • 欢迎来到 SO。一个可重现的数据集将非常有助于解决这个问题。听起来您要求滚动自我加入患者 ID 和入院日期,其中新入院日期在旧出院日期的 30 或 60 天内。这在data.table 中很容易做到,但您在 base R 中的选项可能需要遍历行。
  • 你的意思是Readmit180?您最初要求 180 天的重新接纳,然后参考 60 天的重新接纳。
  • 是的,我的意思是 readmit180,我刚刚编辑了我最初的问题。谢谢

标签: r


【解决方案1】:

实际上我经常这样做:我发现最好的方法是使用data.table。假设你的数据保存为ds,那么:

s <- read.table(text = "Visit Patient Admission Discharge
1 1 2015/01/01 2015/01/02
2 2 2015/01/01 2015/01/01         
3 3 2015/01/01 2015/01/02
4 1 2015/01/09 2015/01/09                                       
5 2 2015/04/01 2015/04/05
6 1 2015/05/01 2015/05/01", header = T, sep = "")

s$Admission <- as.POSIXct(s$Admission, format = "%Y/%m/%d")
s$Discharge <- as.POSIXct(s$Discharge, format = "%Y/%m/%d")

ds <- data.table(s)

setkey(ds, Patient, Admission)
ds <- ds[ , Daydiff := as.numeric(difftime(shift(Admission, n = 1L, fill = 999, type = "lead"), Discharge)), 
          by = "Patient"][ ,':='(Readmit30 = ifelse(abs(Daydiff) <= 30, 1, 0), 
                                 Readmit180= ifelse(abs(Daydiff) <= 180, 1, 0),
                                 Daydiff   = NULL)]

这会导致

> ds
   Visit Patient  Admission  Discharge      Daydiff Readmit30 Readmit180
1:     1       1 2015-01-01 2015-01-02      7.00000         1          1
2:     4       1 2015-01-09 2015-01-09    111.95833         0          1
3:     6       1 2015-05-01 2015-05-01 -16556.15510         0          0
4:     2       2 2015-01-01 2015-01-01     89.95833         0          1
5:     5       2 2015-04-01 2015-04-05 -16530.15510         0          0
6:     3       3 2015-01-01 2015-01-02 -16437.19677         0          0

但请记住,这仅确定哪些记录具有随后的 30 天或 180 天重新接纳,而不是哪些实际上是 30 天或 180 天重新接纳。

【讨论】:

  • 谢谢@akash87,您的代码完全符合我的需要。感谢您抽出宝贵的时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
相关资源
最近更新 更多