R在患者体内发现事件和入院之间的时间

时间:2015-09-02 02:52:17

标签: r data-manipulation

我不知道如何搜索我所追求的内容,所以这可能是一个重复的问题。如果是的话,请提前抱歉!

我有一系列患者入院(数据框'招生'下面)和一系列事件(第二个数据框称为'事件')。 我对入院后5天内发生的事件感兴趣。显然,必须在患者ID内进行匹配(' id')。

在现实生活中,入学数据框在100k点上包含> 500k的入学资格。一名患者可能有多个入院和多个事件。并非所有患者都会有活动。

admissions <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L), date = structure(c(16436, 
16443, 16574, 16468, 16481, 16494), class = "Date")), .Names = c("id", 
"date"), row.names = c(NA, 6L), class = "data.frame")

> admissions
  id       date
1  1 2015-01-01
2  1 2015-01-08
3  1 2015-05-19
4  2 2015-02-02
5  2 2015-02-15
6  2 2015-02-28




events <- structure(list(id = c(1L, 1L, 2L), date = structure(c(16453, 
16578, 16467), class = "Date")), .Names = c("id", "date"), row.names = 7:9, class = "data.frame")

> events
  id       date
7  1 2015-01-18
8  1 2015-05-23
9  2 2015-02-01

我想我只需要考虑每个事件相对于招生的最小天数(仅考虑正值),并在患者中进行匹配。

Event 1 (id ==1): +10 days (10 days after 08/01/2015)
Event 2 (id ==1): +4 days
Event 3 (id ==2): -1 days

然后我可以选择那些落在我窗口内的事件(可能是5天)。

任何帮助非常感谢!我的猜测是涉及lapply(),但由于某种原因,应用程序对我来说并不是很自然(但是!)。

2 个答案:

答案 0 :(得分:3)

使用dplyr

library(dplyr)

mutate(events, event_id=row_number()) %>% # Add event id
    right_join(admissions, by="id") %>% # Join with admissions
    rename(adm_date = date.y, ev_date = date.x) %>% # Clean names
    mutate(diff = ev_date - adm_date) %>% # Compute diffrence
    filter(diff >= 0) %>% # Filter 
    group_by(event_id) %>%
    arrange(diff) %>% # Sort ascending by diff by event_id
    summarise_each(funs(first), ev_date, adm_date, diff) # Get nearest

Source: local data frame [2 x 4]

  event_id    ev_date   adm_date    diff
1        1 2015-01-18 2015-01-08 10 days
2        2 2015-05-23 2015-05-19  4 days

使用data.table滚动加入:

keycols <- c("id", "date")

admissions_dt <- admissions %>% mutate(adm_date = date) %>% as.data.table()
setkeyv(admissions_dt, keycols)

events_dt <- mutate(events, event_id=row_number()) %>% as.data.table()
setkeyv(events_dt, keycols)

admissions_dt[events_dt, roll=10][order(event_id)]

   id       date   adm_date event_id
1:  1 2015-01-18 2015-01-08        1
2:  1 2015-05-23 2015-05-19        2
3:  2 2015-02-01       <NA>        3

答案 1 :(得分:1)

data.table 1.9.5用于其on=功能。

  1. 对于event中的每一行,找到与最近日期&lt; = admissions$date对应的索引。

    idx = setDT(admissions)[events, which=TRUE, roll=TRUE, on=c("id", "date")]
    idx
    # [1]  2  3 NA
    

    如果您已经知道自己只喜欢5天的视窗,那么您可以使用roll=5代替roll=TRUEroll=<positive number>执行LOCF滚动加入。

  2. 索引对应admission中每一行event的匹配行。所以我们现在可以按如下方式提取日期:

    setDT(events)[, adm_date := admission$date[idx]]
    #    id       date   adm_date
    # 1:  1 2015-01-18 2015-01-08
    # 2:  1 2015-05-23 2015-05-19
    # 3:  2 2015-02-01       <NA>