2015-09-02 21 views
0

我不知道如何搜索我所追求的內容,因此這可能是一個重複的問題。如果是這樣,提前抱歉!R在患者中發現事件和入院的時間

我有一系列的患者(數據框「招生」)和一系列事件(第二個數據框稱爲「事件」)招生。 我對入場後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()會涉及到,但由於某種原因,apply對於我來說並不是每個人都很自然(然而!)。

+0

你打算如何日期和編號,因爲它們是不同長度的比較,是我不清楚。 – SabDeM

+0

這就是加入想法的地方... –

+0

事件1的日期應該與患者1的所有3個入院日期進行比較,並且應該選擇最小(正)時間平移。患者1的事件2等同等 – Luc

回答

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

使用data.table 1.9.5on=功能。

  1. 對於event每一行,找到對應於最接近的日期< = 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. 索引對應於event的每一行的admission中的匹配行。所以我們現在可以提取日期如下:

    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> 
    
相關問題