Я провел небольшой тест, сравнивая текущий метод OP с подходом lapply
+ data.table
. Операции выполняются 1000 раз на 1000 строк data.table
с 26 уникальными ключами (keycol
):
set.seed(28)
dat <- data.table(keycol = sample(x = LETTERS, size = 1000, replace = T),
x = rnorm(n = 1000, mean = 30, sd = 2),
y = rnorm(n = 1000, mean = 20, sd = 2),
z = rnorm(n = 1000, mean = 10, sd = 2))
speed_test <- benchmark(
'data_table' = {
model_list <- lapply(X = 1:26, function(z){ #X could be the unique keys or the 1:length(unique(keys))
m <- lm(data = dat[keycol == LETTERS[z], ], formula = x ~ y + z)
smry <- summary(m)
ret_tbl <- data.table(intercept = smry$coefficients[1],
coef_y = smry$coefficients[2],
coef_z = smry$coefficients[3],
r_squared = smry$adj.r.squared,
pvale = smry$coefficients[2,4],
keycol = z)
return(ret_tbl)
})
desired_tbl <- rbindlist(l = model_list, use.names = T, fill = T)
},
'tidyverse1' = {
dat %>% group_by(keycol) %>%
summarise(Intercept = lm(x ~ y + z)$coefficients[1],
Coeff_y = lm(x ~ y + z)$coefficients[2],
Coeff_z = lm(x ~ y + z)$coefficients[3],
R2 = summary(lm(x ~ y + z))$r.squared,
pvalue = summary(lm(x ~ y + z))$coefficients["y",4])
},
replications = 1000,
columns = c("test", "replications", "elapsed")
)
Результат
> speed_test
test replications elapsed
1 data_table 1000 29.477
2 tidyverse1 1000 88.781
Есть большой разрыв во времени выполнения для этих двух способов, поскольку в этом тесте метод lapply
был быстрее.
Примечание. Мне не удалось протестировать версию tidyverse
для разработки, которая имеет nest_by
функция (проблемы с Xcode на моей установке MacOS), но было бы целесообразно включить это в тест, так как набор данных OP имеет 4000 ключей.