Существуют быстрые melt
и dcast
data.table специфичные методы, реализованные в C, в версиях >=1.9.0
.Вот сравнение с другими превосходными ответами из поста @ Джоша о 3-миллионных данных строк (только исключая base ::: агрегат, поскольку это занимало довольно много времени).
Для получения дополнительной информации о записи NEWS, перейдите по ссылке здесь .
Я предполагаю, что у вас 1000 пациентов и всего 5 лет.Вы можете настроить переменные patients
и year
соответственно.
require(data.table) ## >= 1.9.0
require(reshape2)
set.seed(1L)
patients = 1000L
year = 5L
n = 3e6L
condn = c("TRAUMA", "PREGNANCY", "SEIZURE")
# dummy data
DT <- data.table(PatientID = sample(patients, n, TRUE),
Year = sample(year, n, TRUE),
PrimaryConditionGroup = sample(condn, n, TRUE))
DT_dcast <- function(DT) {
dcast.data.table(DT, PatientID ~ Year, fun.aggregate=length)
}
reshape2_dcast <- function(DT) {
reshape2:::dcast(DT, PatientID ~ Year, fun.aggregate=length)
}
DT_raw <- function(DT) {
DT[ , list(TRAUMA = sum(PrimaryConditionGroup=="TRAUMA"),
PREGNANCY = sum(PrimaryConditionGroup=="PREGNANCY"),
SEIZURE = sum(PrimaryConditionGroup=="SEIZURE")),
by = list(PatientID, Year)]
}
# system.time(.) timed 3 times
# Method Time_rep1 Time_rep2 Time_rep3
# dcast_DT 0.393 0.399 0.396
# reshape2_DT 3.784 3.457 3.605
# DT_raw 0.647 0.680 0.657
dcast.data.table
примерно в 1,6 раза быстрее, чем обычное агрегирование, используя data.table
и в 8,8 раза быстрее, чем reshape2:::dcast
.