Как пометить пропуски во временных данных - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь создать флаг для определения пробелов в данных временных отметок более 2 дней. Этот вопрос почти выполняет то, что мне нужно , но мои данные о времени находятся в одном столбце, а не в начале и конце столбца.Также я использую data.table.Прямо сейчас я пытаюсь с diff(), но я думаю, что это, вероятно, может быть достигнуто с lag(), как в связанном вопросе.

Пока у меня есть это:

library(data.table)

myID <- c(1,1,1,1,1,1,2,2,2,2,2,2)
BST <- c("2017-06-01 00:00:01", "2017-06-01 00:00:02",
         "2017-06-02 00:00:01", "2017-06-02 00:00:02", 
         "2017-06-03 00:00:01", "2017-06-03 00:00:02",
         "2017-06-01 00:00:01", "2017-06-01 00:00:02", 
         "2017-06-05 00:00:01", "2017-06-05 00:00:02", 
         "2017-06-09 00:00:01", "2017-06-09 00:00:02")
dt1 <- data.table(myID, BST)

# Create gapFlag
dt1 <- dt1[, gapFlag := lapply(.SD, function(x) which(as.duration(diff(dt1$BTS))/ddays(1) > 2)), by = myID]

Но этокажется, работает бесконечно ... мой фактический data.table превышает 10 миллионов строк.

Мой желаемый результат выглядит следующим образом (с дополнительным бонусом подсчета пробелов в gapCount):

enter image description here

Ответы [ 2 ]

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

Вот еще один подход с использованием diff, который также дает gapCount:

library(data.table)

dt1[, gapFlag := c(0, diff(as.Date(BST)))>2, by = myID][, gapCount := cumsum(gapFlag), by = myID]

Результат:

    myID                 BST gapFlag gapCount
 1:    1 2017-06-01 00:00:01   FALSE        0
 2:    1 2017-06-01 00:00:02   FALSE        0
 3:    1 2017-06-02 00:00:01   FALSE        0
 4:    1 2017-06-02 00:00:02   FALSE        0
 5:    1 2017-06-03 00:00:01   FALSE        0
 6:    1 2017-06-03 00:00:02   FALSE        0
 7:    2 2017-06-01 00:00:01   FALSE        0
 8:    2 2017-06-01 00:00:02   FALSE        0
 9:    2 2017-06-05 00:00:01    TRUE        1
10:    2 2017-06-05 00:00:02   FALSE        1
11:    2 2017-06-09 00:00:01    TRUE        2
12:    2 2017-06-09 00:00:02   FALSE        2
0 голосов
/ 07 июня 2018

Вот подход с запаздыванием

dt1[, l_BST := shift(BST), by = myID]

Затем вы можете сравнить два столбца в зависимости от того, каково ваше определение «разрыва» (например,> 2 дня между двумя, без значений NA влибо).

Если вы хотите использовать diff() и не выходить за пределы data.table (т. е. других пакетов), вы также можете сделать это:

dt1[, gapFlag := c(0, diff(as.Date(BST))) > 2, by = myID]
dt1[, GapCount := cumsum(gapFlag), by = myID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...