我不知道如何搜索我所追求的内容,所以这可能是一个重复的问题。如果是的话,请提前抱歉!
我有一系列患者入院(数据框'招生'下面)和一系列事件(第二个数据框称为'事件')。 我对入院后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(),但由于某种原因,应用程序对我来说并不是很自然(但是!)。
答案 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=
功能。
对于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=TRUE
。 roll=<positive number>
执行LOCF滚动加入。
索引对应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>