R - исключить строки с событиями по дате - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть фрейм данных с идентификаторами, датами входа, событиями (X1.0 и X1.1) и датами, соответствующими времени событий (X2.0 и X2.1). Мне нужно найти идентификаторы людей, у которых было определенное c событие до даты входа.

library(dplyr)

df <- data.frame(ID = as.integer(c(10001, 10002, 10004, 10005, 10006)),
                 entry_date = as.Date(c("2013-12-22", "2013-02-13", "2013-03-13", "2013-01-01", "2013-02-02")), 
                 X1.0 = as.integer(c(150, NA, 120, NA, 150)),
                 X1.1 = as.integer(c(120, 180, NA, 150, 120)),
                 X2.0 = as.Date(c("2017-02-13", NA, "2014-06-04", NA, "1990-03-08")), 
                 X2.1 = as.Date(c("2003-12-22", "2011-02-13", NA, "1998-01-01", "2015-02-01")))

#filtering columns that begin with X1 by event 150

> dplyr::filter_at(df, vars(starts_with("X1")), any_vars(. == 150)) 

     ID entry_date X1.0 X1.1       X2.0       X2.1
1 10001 2013-12-22  150  120 2017-02-13 2003-12-22
2 10005 2013-01-01   NA  150       <NA> 1998-01-01
3 10006 2013-02-02  150  120 1990-03-08 2015-02-01

Моя проблема заключается в условной фильтрации дат, потому что меня интересует только фильтрация "150" событий, которые произошли до даты входа, и есть другие события, присутствующие. Конечный результат должен выглядеть так:

     ID entry_date X1.0 X1.1       X2.0       X2.1
1 10005 2013-01-01   NA  150       <NA> 1998-01-01
2 10006 2013-02-02  150  120 1990-03-08 2015-02-01

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Мы можем получить данные в длинном формате, получая значение события и дату события в отдельных столбцах. Затем мы можем выбрать только те строки, которые имеют значение события как 150 и entry_date больше, чем дата события. Мы присоединяем эти данные обратно к df, чтобы получить все соответствующие столбцы.

library(dplyr)

df %>%
  tidyr::pivot_longer(cols = -c(ID, entry_date), 
                      names_to = c('.value', 'col'), 
                      names_sep = "\\.") %>%
   filter(X1 == 150 & entry_date > X2) %>%
   select(ID) %>%
   left_join(df, by = 'ID')


#    ID entry_date  X1.0  X1.1 X2.0       X2.1      
#  <int> <date>     <int> <int> <date>     <date>    
#1 10005 2013-01-01    NA   150 NA         1998-01-01
#2 10006 2013-02-02   150   120 1990-03-08 2015-02-01
0 голосов
/ 28 апреля 2020

Вот решение, предназначенное для другой функции фильтра:


dplyr::filter_at(df, vars(starts_with("X1")), any_vars(. == 150)) %>% 
                                             filter(X2.0 <= entry_date | is.na(X2.0))


#     ID entry_date X1.0 X1.1       X2.0       X2.1
#1 10005 2013-01-01   NA  150       <NA> 1998-01-01
#2 10006 2013-02-02  150  120 1990-03-08 2015-02-01

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...