Отсутствуют значения при использовании which.max в R data.table с NA - PullRequest
0 голосов
/ 30 апреля 2018

Я сталкиваюсь с проблемой, когда делаю группировку и which.max с R data.table, и я не уверен, является ли это ошибкой, или я не правильно понимаю структуры группировки в data.table , У меня есть обходной путь, я просто пытаюсь понять, почему моя первоначальная попытка не удалась.

Я смотрю на таблицу, содержащую временные ряды, и хочу получить либо (а) время, когда произошло интересующее событие, либо (б) окончательную отметку времени во временном ряду. События маркировки столбца: «NA», если событие не произошло, и «1», если оно произошло.

Вот минимальный пример для воспроизведения проблемы:

dt <- data.table(t = seq(9), event = c(NA, NA, NA, NA, 1, NA, 1, NA, NA), t_id = c(rep('A', 3), rep('B', 3), rep('C', 3)))
dt[, ifelse(is.null(which.max(event)), max(t), t[which.max(event)]), by=t_id]

Возвращает

t_id    V1
   A    NA
   B    5
   C    7

Где значение для группы "A" равно NA (я бы наивно ожидал, что оно будет 3). Если я запускаю это без функции ifelse

dt[, t[which.max(event)], by=t_id]

строка для «A» просто отсутствует (которая .max возвращает NULL). Но если я бегу

dt[, is.null(which.max(event)), by=t_id]

Я получаю

t_id    V1
   A    FALSE
   B    FALSE
   C    FALSE

Чего мне не хватает?

1 Ответ

0 голосов
/ 01 мая 2018

Будет ли это работать:

library(data.table)
dt <- data.table(t = seq(9), 
                 event = c(NA, NA, NA, NA, 1, NA, 1, NA, NA), 
                 t_id = c(rep('A', 3), rep('B', 3), rep('C', 3)))
dt[, ifelse(length((na.omit(event)))==0, which.max(t), t[which.max(event)] ), by=t_id]


> dt[, ifelse(length((na.omit(event)))==0, which.max(t), t[which.max(event)] ), by=t_id]
   t_id V1
1:    A  3
2:    B  5
3:    C  7

Проблема с вашим подходом заключается в том, что which.max () не возвращает объект NULL:

> is.null(which.max(c(NA,NA,NA)))
[1] FALSE

Но если вы попробуете length(), вы получите ожидаемый результат:

> length(which.max(c(NA,NA,NA))) == 0
[1] TRUE

Также я понимаю, что столбец event может содержать значения, отличные от 1 и NA. Как:

dt <- data.table(t = seq(9), event = c(NA, NA, NA, NA, 1,3, 5, 2, NA, 2, 1, NA, NA), t_id = c(rep('A', 3), rep('B', 6), rep('C', 4)))
dt[, ifelse(length((na.omit(event)))==0, which.max(t), t[which.max(event)] ), by=t_id]

В этом случае таблица данных выглядит следующим образом:

> dt
    t event t_id
 1: 1    NA    A
 2: 2    NA    A
 3: 3    NA    A
 4: 4    NA    B
 5: 5     1    B
 6: 6     3    B
 7: 7     5    B
 8: 8     2    B
 9: 9    NA    B
10: 1     2    C
11: 2     1    C
12: 3    NA    C
13: 4    NA    C

И результат:

> dt[, ifelse(length((na.omit(event)))==0, which.max(t), t[which.max(event)] ), by=t_id]
   t_id V1
1:    A  3
2:    B  7
3:    C  1

Если столбец событий может содержать только NAs и 1s, решение будет намного проще.

Еще одно примечание (см. Обсуждение ниже): для этого случая ifelse (na.omit ()) может быть не самым эффективным - несколько предложений можно найти в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...