繁体   English   中英

如何在R中互相找到特定时间范围内的观测值

[英]How to find observations within a certain time range of each other in R

我有一个ID,日期,生命天数和用药变量的数据集。 每个ID都有多个观察值,指示某种药物的不同给药方式。 我想查找在彼此之间365天内进行管理的UNIQUE药品。 数据帧的示例如下:

ID    date          dayoflife    meds
1     2003-11-24    16361        lasiks
1     2003-11-24    16361        vigab
1     2004-01-09    16407        lacos
1     2013-11-25    20015        pheno
1     2013-11-26    20016        vigab
1     2013-11-26    20016        lasiks
2     2008-06-05    24133        pheno
2     2008-04-07    24074        vigab
3     2014-11-25    8458         pheno
3     2014-12-22    8485         pheno

我希望结果是:

ID    N
1     3
2     2
3     1

表示个人1在彼此之间365天内最多服用3种不同类型的药物。 我不确定是否最好使用生活的日子或日期来达到预期的结果。

一种办法是转换的“日期”到Date类,由“ID”进行分组,让abs olute diff “日期”和的erence lag之列,检查它是否大于365时,创建一组指数cumsumsummarise得出“药物”的不同元素的数量

library(dplyr)
df1 %>% 
   mutate(date = as.Date(date)) %>%
   group_by(ID) %>% 
   mutate(diffd = abs(as.numeric(difftime(date, lag(date, default = first(date)),
               units = 'days')))) %>%
   group_by(grp = cumsum(diffd > 365), add = TRUE) %>%
   summarise(N = n_distinct(meds)) %>%
   group_by(ID) %>%
   summarise(N = max(N))
# A tibble: 3 x 2
#     ID     N
#  <int> <int>
#1     1     2
#2     2     2
#3     3     1

你可以试试:

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(date = as.Date(date),
         lag_date = abs(date - lag(date)) <= 365,
         lead_date = abs(date - lead(date)) <= 365) %>%
  mutate_at(vars(lag_date, lead_date), ~ ifelse(., ., NA)) %>%
  filter(coalesce(lag_date, lead_date)) %>%
  summarise(N = n_distinct(meds))

输出:

# A tibble: 3 x 2
     ID     N
  <int> <int>
1     1     2
2     2     2
3     3     1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM