【问题标题】:Building Admissions - Cross Record Comparison - data.table建筑招生 - 交叉记录比较 - data.table
【发布时间】:2019-03-06 17:39:45
【问题描述】:

我是 R 和 data.table 的新手,我的大脑天生就可以在 SAS 中思考,所以我正在寻找解决以下问题的方法。

我有跨越“从”到“到”一段时间的健康账单。我想创建招生,我标记所有连续的账单(即它们之间不超过一天)。在下面的示例数据中,患者、来自和直通列是我们开始的内容,而承认列是我要添加的内容。

Name    From    Thru    Admit
John    1/1/18  1/7/18  1
John    1/8/18  1/15/18 1
John    1/18/18 1/20/18 2
Jane    1/1/18  1/3/18  3
Jane    1/5/18  1/8/18  4
Jane    1/10/18 1/17/18 5
Jane    1/12/18 1/17/18 5
Jane    1/18/18 1/24/18 5
Frank   2/1/18  2/1/18  6
Frank   2/1/18  2/10/18 6
Frank   2/3/18  2/3/18  6
Frank   2/4/18  2/4/18  6
Frank   2/5/18  2/5/18  6

我更喜欢面向 data.table 的解决方案。我需要一些提示 - 在 SAS 中我确切地知道如何做到这一点,但我正在尝试学习新的东西。

谢谢。

【问题讨论】:

  • 您需要使用日期格式(请参阅?Date?IDate),然后可以执行DT[, g := .GRP, by=.(Name, cumsum(From - shift(Thru) > 1))] 之类的操作
  • @josemz 的代码仍然给出了上面的 Admit 列,对吧?也许如果你消除倒数第二行..?

标签: r data.table


【解决方案1】:

根据 Frank 的评论,如果您的 data.table 被称为 DT

date_cols <- c("From", "Thru")
DT[, (date_cols) := lapply(.SD, as.Date, format = "%m/%d/%y"), .SDcols = date_cols]
DT[, Admit := 1 + cumsum(From - shift(Thru, fill = Thru[1]) > 1 | 
                         Name != shift(Name, fill = Name[1]))]
DT

#    Name       From       Thru Admit
# 1: John 2018-01-01 2018-01-07     1
# 2: John 2018-01-08 2018-01-05     1
# 3: John 2018-01-18 2018-01-20     2
# 4: Jane 2018-01-01 2018-01-03     3
# 5: Jane 2018-01-05 2018-01-08     4
# 6: Jane 2018-01-10 2018-01-17     5
# 7: Jane 2018-01-12 2018-01-17     5
# 8: Jane 2018-01-18 2018-01-24     5

虽然这假设每位患者的所有观察结果都是连续的,但您可能希望确保数据中的情况属实。

【讨论】:

  • 非常聪明,而且很接近。它给了我工作的东西。仍然坚持弗兰克的交叉记录比较。不知何故,我们需要在可变数量的后续记录中记住 2/10 到日期。
  • 此扩展适用于新示例,我认为:DT[, g := 1L + cumsum( From - shift(cummax(as.integer(Thru)), fill = Thru[1]) &gt; 1 ), by=Name][, g := .GRP, by=.(Name,g)][](请随意编辑)
  • 是的 - 这解决了问题。不知道如何为您的解决方案提供“功劳”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多