эффективно находить по группам в одной R data.table

У меня большой, широкийdata.table (20-метровые строки), вводимые с помощью идентификатора человека, но с большим количеством столбцов (~ 150), которые имеют множество нулевых значений. Каждый столбец - это записанное состояние / атрибут, который я хочу перенести для каждого человека. Каждый человек может иметь от 10 до 10 000 наблюдений, и в наборе присутствует около 500 000 человек. Значения от одного человека не могут «перетекать» в следующее лицо, поэтому мое решение должно учитывать столбец и группу идентификаторов людей соответствующим образом.

Для демонстрации - вот очень маленький пример ввода:

DT = data.table(
  id=c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
  aa=c("A", NA, "B", "C", NA, NA, "D", "E", "F", NA, NA, NA),
  bb=c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
  cc=c(1, NA, NA, NA, NA, 4, NA, 5, 6, NA, 7, NA)
)

Это выглядит так:

    id aa bb cc
 1:  1  A NA  1
 2:  1 NA NA NA
 3:  1  B NA NA
 4:  1  C NA NA
 5:  2 NA NA NA
 6:  2 NA NA  4
 7:  2  D NA NA
 8:  2  E NA  5
 9:  3  F NA  6
10:  3 NA NA NA
11:  3 NA NA  7
12:  3 NA NA NA

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

    id aa bb cc
 1:  1  A NA  1
 2:  1  A NA  1
 3:  1  B NA  1
 4:  1  C NA  1
 5:  2 NA NA NA
 6:  2 NA NA  4
 7:  2  D NA  4
 8:  2  E NA  5
 9:  3  F NA  6
10:  3  F NA  6
11:  3  F NA  7
12:  3  F NA  7

Я нашелdata.table Решение, которое работает, но это очень медленно на моих больших наборах данных:

DT[, na.locf(.SD, na.rm=FALSE), by=id]

Я нашел эквивалентные решения, использующие dplyr, которые одинаково медленны.

GRP = DT %>% group_by(id)
data.table(GRP %>% mutate_each(funs(blah=na.locf(., na.rm=FALSE))))

Я надеялся, что смогу придумать объединяющее «я» соединение, используяdata.table функциональность, но я просто не могу понять это правильно (я подозреваю, что мне нужно было бы использовать.N но я просто не разобрался)

На данный момент я думаю, что мне придется написать что-то в Rcpp для эффективного применения сгруппированного locf.

Я новичок в R, но я не новичок в C ++ - так что я уверен, что смогу это сделать. Я просто чувствую, что должен быть эффективный способ сделать это в R, используяdata.table.

Ответы на вопрос(1)

Ваш ответ на вопрос