【问题标题】:How to find observations within a certain time range of each other in R如何在R中找到彼此在一定时间范围内的观察值
【发布时间】:2019-07-31 14:31:03
【问题描述】:

我有一个包含 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 种不同类型的药物。我不确定是否最好使用生命天数或日期来达到此预期结果。感谢任何帮助

【问题讨论】:

  • 为什么预期结果不包含针对1 2013-11-25 20015 pheno 的额外行1 1
  • 你是对的——因为有些人会在几年后服用多种药物

标签: r dplyr


【解决方案1】:

一个选项是将'date'转换为Date类,按'ID'分组,获取'date'的absolute difference和列的lag,检查是否大于365,用cumsum创建分组索引,得到summarise中'meds'的不同元素个数

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

【讨论】:

  • 对不起,我对 R 很陌生-你介意解释一下 ```group_by(grp = cumsum(diffd > 365), add = TRUE)
  • @sip255 根据'diffd'中相邻元素的差异创建分组变量。 v1 &lt;- c(1, 250, 1500, 250); diff(v1)返回相邻元素的差值,然后比较absolutee的差值是否大于365,返回一个逻辑向量。用 cumsum 包装,在每个 TRUE 元素上加 1,创建某种类型的 bin 来分组
【解决方案2】:

你可以试试:

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

【讨论】:

  • 谢谢!然而,我遇到了一些我以前没有想到的事情。我刚刚编辑了示例代码以更改 ID 1 的一种药物,我相信代码的输出会给出 4,因为会有 4 种独特的药物,但在不同的 365 天期间。我如何更改此代码以获得 3 的输出,因为我正在寻找每个 ID 在每 365 天内的唯一药物的最大数量?
猜你喜欢
  • 2022-01-08
  • 2021-08-26
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多