R - Рассчитать наблюдения, прошедшие с момента последнего события, с несколькими типами событий и идентификаторами - PullRequest
0 голосов
/ 24 марта 2020

Мне интересно, как рассчитать количество наблюдений, начиная с события того же типа, но также найти количество наблюдений, начиная с события любого другого типа. У меня также есть идентификаторы в моей базе данных.

Для иллюстрации, пожалуйста, смотрите ниже. Я пытаюсь сделать это в R, используя Datatables, но с небольшим результатом.

У меня есть дата, описанная ниже:

  date     event  id
2000-07-06     2  1
2000-07-07     1  1
2000-07-09     0  1
2000-07-10     0  1
2000-07-15     2  1
2000-07-16     1  1
2000-07-20     0  1
2000-07-21     1  1
2000-07-06     1  2
2000-07-07     2  2
2000-07-15     0  2
2000-07-16     0  2
2000-07-17     2  2
2000-07-18     1  2

, и что я хотел бы иметь что-то вроде этого :

  date     event  id obs_since_event_1 obs_since_event_2
2000-07-06     2  1        NA                 NA
2000-07-07     1  1        NA                 1
2000-07-09     0  1        1                  2
2000-07-10     0  1        2                  3
2000-07-15     2  1        3                  4
2000-07-16     1  1        4                  1
2000-07-20     0  1        1                  2
2000-07-21     1  1        2                  3
2000-07-06     1  2        NA                 NA
2000-07-07     2  2        1                  NA
2000-07-15     0  2        2                  1
2000-07-16     0  2        3                  2
2000-07-17     2  2        4                  3
2000-07-18     1  2        5                  1

Два события являются взаимоисключающими, то есть они не могут происходить в один и тот же наблюдаемый день. Надеюсь услышать несколько хороших советов. Всего наилучшего.

1 Ответ

1 голос
/ 24 марта 2020

Вот способ сделать это, используя dplyr и нестандартную оценку:

library(dplyr)

apply_fun <- function(df, value) {

  col <- paste0('obs_since_event_', value)
  df %>%
    group_by(id) %>%
    group_by(temp = lag(cumsum(event == value), default = 0), add = TRUE) %>%
    mutate(!!col := row_number()) %>%
    ungroup() %>%
    mutate(!!col := replace(!!sym(col), temp == 0, NA))  %>%
    select(-temp)
}

df <- apply_fun(df, 1)
df <- apply_fun(df, 2)

df

# A tibble: 14 x 5
#   date       event    id obs_since_event_1 obs_since_event_2
#   <fct>      <int> <int>             <int>             <int>
# 1 2000-07-06     2     1                NA                NA
# 2 2000-07-07     1     1                NA                 1
# 3 2000-07-09     0     1                 1                 2
# 4 2000-07-10     0     1                 2                 3
# 5 2000-07-15     2     1                 3                 4
# 6 2000-07-16     1     1                 4                 1
# 7 2000-07-20     0     1                 1                 2
# 8 2000-07-21     1     1                 2                 3
# 9 2000-07-06     1     2                NA                NA
#10 2000-07-07     2     2                 1                NA
#11 2000-07-15     0     2                 2                 1
#12 2000-07-16     0     2                 3                 2
#13 2000-07-17     2     2                 4                 3
#14 2000-07-18     1     2                 5                 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...