Количество дней с момента события в data.table - PullRequest
0 голосов
/ 07 июня 2018
library(data.table)
dt <- data.table(cbind(id = c(rep("0151", 16), rep("4615", 16)),
date = rep(c("2011-08-09",
"2011-08-10",
"2011-08-12",
"2011-08-14",
"2011-08-15",
"2011-08-16",
"2011-08-17",
"2011-08-18",
"2011-08-19",
"2011-08-20",
"2011-08-23",
"2011-08-24",
"2011-08-27",
"2011-08-28",
"2011-08-30",
"2011-08-31"), 2),
count = c(c(7, 1, 0, 4, 1, 4, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1),
c(0, 1, 3, 0, 1, 0, 5, 1, 0, 0, 5, 0, 1, 2, 0, 1))))

Для каждого идентификатора я ищу способ эффективно вычислить (и сохранить в новом столбце), сколько дней прошло с последнего дня, считающего> 0. Таким образом, 4-й столбец будет выглядеть так:

c(NA, 1, 2, 4, 1, 1, 1, 1, 1, 2, 5, 6, 9, 10, 2, 3, NA, NA, 2, 2, 3, 1, 2, 1, 1, 2, 5, 1, 4, 1, 2, 3)

1 Ответ

0 голосов
/ 07 июня 2018

Мы можем использовать na.locf из zoo, чтобы создать новый столбец дат, где даты с последнего дня заполнены вниз count > 0, и взять lag этого, поскольку мы не хотим возвращать 0 дней, еслисама дата имеет count > 0.Вместо этого мы хотим посчитать количество дней от предыдущей ненулевой count даты.Наконец, мы находим difftime между date и date2:

library(data.table)
library(zoo)

dt[,count2 := difftime(date, na.locf(lag(ifelse(count > 0, date, NA)), na.rm = FALSE)), by = id]

Результат:

      id       date count  count2
 1: 0151 2011-08-09     7 NA days
 2: 0151 2011-08-10     1  1 days
 3: 0151 2011-08-12     0  2 days
 4: 0151 2011-08-14     4  4 days
 5: 0151 2011-08-15     1  1 days
 6: 0151 2011-08-16     4  1 days
 7: 0151 2011-08-17     2  1 days
 8: 0151 2011-08-18     1  1 days
 9: 0151 2011-08-19     0  1 days
10: 0151 2011-08-20     0  2 days
11: 0151 2011-08-23     0  5 days
12: 0151 2011-08-24     0  6 days
13: 0151 2011-08-27     0  9 days
14: 0151 2011-08-28     1 10 days
15: 0151 2011-08-30     0  2 days
16: 0151 2011-08-31     1  3 days
17: 4615 2011-08-09     0 NA days
18: 4615 2011-08-10     1 NA days
19: 4615 2011-08-12     3  2 days
20: 4615 2011-08-14     0  2 days
21: 4615 2011-08-15     1  3 days
22: 4615 2011-08-16     0  1 days
23: 4615 2011-08-17     5  2 days
24: 4615 2011-08-18     1  1 days
25: 4615 2011-08-19     0  1 days
26: 4615 2011-08-20     0  2 days
27: 4615 2011-08-23     5  5 days
28: 4615 2011-08-24     0  1 days
29: 4615 2011-08-27     1  4 days
30: 4615 2011-08-28     2  1 days
31: 4615 2011-08-30     0  2 days
32: 4615 2011-08-31     1  3 days
      id       date count  count2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...