Будет ли это работать:
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 ()) может быть не самым эффективным - несколько предложений можно найти в комментариях.