Фильтрация времени до данных события в Tidyverse - PullRequest
2 голосов
/ 19 января 2020

У меня есть время для данных о событиях, с которыми я работаю. Я хотел бы отфильтровать данные с первого раза, когда субъект находится в исследовании, до первого наблюдаемого события (не беспокоиться о повторяющихся событиях, которые произошли после первого события - только хочу изучить время до первого события).

Я использую between в функции filter, которая всегда работала для меня в прошлом, но имеет проблемы здесь, потому что есть некоторые субъекты, у которых никогда не было события, и, таким образом, я получаю ошибку, которая заявляет Error: Expecting a single value: [extent=0].

Я думаю, что мне нужен метод фильтрации данных для субъекта от начала входа в исследование до времени первого события ИЛИ, если нет события субъекта, все данные для субъекта.

Вот пример того, как выглядят мои данные:

## data
subject <- c("A", "A", "A", "A", "B", "B", "C", "C", "C", "D", "E", "E", "E", "E", "E", "F", "F", "F", "F", "F")
event <- c(0,0,1,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0)

df <- data.frame(subject, event)

## create index to count the days the subject is in the study
library(tidyverse)

df <- df %>%
    group_by(subject) %>%
    mutate(ID = seq_along(subject))

df

# A tibble: 20 x 3
# Groups:   subject [6]
   subject event    ID
   <fct>   <dbl> <int>
 1 A           0     1
 2 A           0     2
 3 A           1     3
 4 A           0     4
 5 B           0     1
 6 B           0     2
 7 C           0     1
 8 C           0     2
 9 C           1     3
10 D           0     1
11 E           0     1
12 E           1     2
13 E           0     3
14 E           1     4
15 E           1     5
16 F           0     1
17 F           0     2
18 F           0     3
19 F           0     4
20 F           0     5

## filter event times between the start of the trial and when the subject has the event for the first time

df %>%
    group_by(subject) %>%
    filter(., between(row_number(), 
        left = which(ID == 1),
        right = which(event == 1)))

В последней части моя ошибка возникает.

1 Ответ

2 голосов
/ 19 января 2020

Это то, что вы ищете?

df2 <- df %>%
  group_by(subject) %>%
  filter(cumsum(event) == 0 | (cumsum(event) == 1 & event == 1))

Результат:

# A tibble: 16 x 2
# Groups:   subject [6]
   subject event
   <fct>   <dbl>
 1 A           0
 2 A           0
 3 A           1
 4 B           0
 5 B           0
 6 C           0
 7 C           0
 8 C           1
 9 D           0
10 E           0
11 E           1
12 F           0
13 F           0
14 F           0
15 F           0
16 F           0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...