簡體   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