You could use the broom package:
library(tidyverse)
library(broom)
# aic and bic
mtcars %>%
group_split(cyl)%>%
map(~glance(lm(wt~qsec, data = .))) %>%
set_names() %>%
map_df(bind_rows, .id = "model")
# A tibble: 3 × 13
model r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int>
1 list(r.squared = 0.407071270040772, adj.r.squared = 0.3411903000… 0.407 0.341 0.462 6.18 0.0347 1 -6.02 18.0 19.2 1.92 9 11
2 list(r.squared = 0.749889147028081, adj.r.squared = 0.6998669764… 0.750 0.700 0.195 15.0 0.0117 1 2.68 0.639 0.477 0.191 5 7
3 list(r.squared = 0.287884462711336, adj.r.squared = 0.2285415012… 0.288 0.229 0.667 4.85 0.0479 1 -13.1 32.2 34.2 5.34 12 14
# coefficients
mtcars %>%
group_split(cyl)%>%
map(~tidy(lm(wt~qsec, data = .))) %>%
set_names() %>%
map_df(bind_rows, .id = "model")
# A tibble: 6 × 6
model term estimate std.error statistic p.value
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 "list(term = c(\"(Intercept)\", \"qsec\"), estimate = c(-1.84776049207306, 0.215991475050134), std.error = c(1.66871372… (Interce… -1.85 1.67 -1.11 0.297
2 "list(term = c(\"(Intercept)\", \"qsec\"), estimate = c(-1.84776049207306, 0.215991475050134), std.error = c(1.66871372… qsec 0.216 0.0869 2.49 0.0347
3 "list(term = c(\"(Intercept)\", \"qsec\"), estimate = c(-0.132915666904211, 0.18078837943682), std.error = c(0.84264638… (Interce… -0.133 0.843 -0.158 0.881
4 "list(term = c(\"(Intercept)\", \"qsec\"), estimate = c(-0.132915666904211, 0.18078837943682), std.error = c(0.84264638… qsec 0.181 0.0467 3.87 0.0117
5 "list(term = c(\"(Intercept)\", \"qsec\"), estimate = c(-1.71471416603641, 0.340679691344107), std.error = c(2.60035841… (Interce… -1.71 2.60 -0.659 0.522
6 "list(term = c(\"(Intercept)\", \"qsec\"), estimate = c(-1.71471416603641, 0.340679691344107), std.error = c(2.60035841… qsec 0.341 0.155 2.20 0.0479