[英]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時,創建一組指數cumsum
, summarise
得出“葯物”的不同元素的數量
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.