Я новичок с data.table
, но я знаю, что он может значительно улучшить производительность по сравнению с dplyr
, когда нужно вычислить большое количество групп.
Я не выяснил синтаксис data.table
для обеих групп по PCRID и рассчитал количество не-NA по многим столбцам.Чтобы обойти это, я попытался использовать dtplyr
, основанный на dplyr
интерфейс для data.table
, и получил некоторые существенные улучшения производительности.
Используя некоторые поддельные данные (см. Внизу) такого же размера, как и у вас, подсчет из вашего поста занял 197 секунд, но когда я загрузил data.table
и dtplyr
и перезапустил его, потребовалось 77 секунд, сбривая 61% времени, с тем же выходом.Ваши результаты могут отличаться, но я не удивлюсь, если будут еще data.table
возможности, позволяющие значительно сократить это время.
library(data.table); library(dtplyr)
vitals_fake_DT <- data.table(vitals_fake)
vitals_fake_DT %>%
arrange(PCRID) %>% # to make output order the same way between methods
group_by(PCRID) %>%
summarise(
n_AVPU = sum(!is.na(avpu)),
n_SBP = sum(!is.na(sbp)),
# etc.
Поддельные данные с 20 миллионами строк и 10 миллионами групп:
rows = 20000000
grps = 10000000 # max, somewhat less in practice
set.seed(42)
vitals_fake <- data.frame(
PCRID = sample(1:grps, size = rows, replace = T),
avpu = sample(c(NA, 1:10), size = rows, replace = T),
sbp = sample(c(NA, 1:10), size = rows, replace = T),
dbp = sample(c(NA, 1:10), size = rows, replace = T),
pulserate = sample(c(NA, 1:10), size = rows, replace = T),
rr = sample(c(NA, 1:10), size = rows, replace = T),
spo2 = sample(c(NA, 1:10), size = rows, replace = T),
etco2 = sample(c(NA, 1:10), size = rows, replace = T),
co = sample(c(NA, 1:10), size = rows, replace = T),
glucose = sample(c(NA, 1:10), size = rows, replace = T),
tempf = sample(c(NA, 1:10), size = rows, replace = T),
painscale = sample(c(NA, 1:10), size = rows, replace = T),
gcs = sample(c(NA, 1:10), size = rows, replace = T)
)