Как проверить переменные на определенную дату +/- 2 дня в R - PullRequest
0 голосов
/ 25 февраля 2019

Я действительно надеюсь, что кто-то может помочь мне с этим вопросом, потому что я боролся в течение некоторого времени.Мои данные выглядят так:

ID DATE        VAR1       VAR2  
01 2018-07-27      0         0  
01 2018-07-28      0         0  
01 2018-07-29      0         1  
01 2018-07-30      0         1  
01 2018-07-31      0         1  
01 2018-08-01      0         0
02 2018-09-30      1         0  
02 2018-10-01      0         0  
02 2018-10-02      0         1  
02 2018-10-03      1         1  
02 2018-10-04      1         1  
02 2018-10-05      0         1  
02 2018-10-06      0         0  
02 2018-10-07      0         0  
02 2018-10-08      0         0  
02 2018-10-10      0         0  
02 2018-10-12      0         0  
02 2018-10-13      0         0 
02 2018-10-14      0         0  
02 2018-10-15      1         0  
02 2018-10-18      1         0  
02 2018-10-19      0         0  
02 2018-10-20      0         0 
02 2018-10-26      0         0  
02 2018-10-28      0         0  
02 2018-11-02      0         1 

Я хочу знать для каждого идентификатора, присутствовал ли VAR1 или нет в первый день, когда присутствовал VAR 2 +/- 2 дня.Я хотел бы сохранить ответы в новом фрейме данных, например:

ID PRESENT
01 0  
02 1   

Кто-нибудь знает, как это сделать?VAR2 - это менструальный цикл.Для некоторых идентификаторов у меня есть данные о множественных менструациях.Если VAR1 присутствовал в первый день +/- 2 дня во время одной из менструаций, я хочу, чтобы они вышли положительными.

Заранее спасибо!

1 Ответ

0 голосов
/ 25 февраля 2019

Один способ сделать это, но должен быть лучший хак:

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(
    DATE = as.Date(DATE),
    VAR2 = ifelse(VAR2 == 1 & lag(VAR2) == 1, 0, VAR2),
    PRESENT = sapply(DATE,
                     function(x) any(VAR1[between(DATE, x - 2, x + 2)] == 1)) & VAR2 == 1
  ) %>% 
  summarise(PRESENT = +any(PRESENT))

Вывод:

# A tibble: 2 x 2
     ID PRESENT
  <int>   <int>
1     1       0
2     2       1

Используемые данные:

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L
), DATE = structure(1:26, .Label = c("2018-07-27", "2018-07-28", 
"2018-07-29", "2018-07-30", "2018-07-31", "2018-08-01", "2018-09-30", 
"2018-10-01", "2018-10-02", "2018-10-03", "2018-10-04", "2018-10-05", 
"2018-10-06", "2018-10-07", "2018-10-08", "2018-10-10", "2018-10-12", 
"2018-10-13", "2018-10-14", "2018-10-15", "2018-10-18", "2018-10-19", 
"2018-10-20", "2018-10-26", "2018-10-28", "2018-11-02"), class = "factor"), 
    VAR1 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L), 
    VAR2 = c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L)), class = "data.frame", row.names = c(NA, 
-26L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...