эффективно находить по группам в одной 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
.