I propose a slightly different approach
library(tidyverse)
data(mtcars)
flm = function(data) lm(mpg~value, data)
fres = function(model) model$resid
mtcars %>% as_tibble() %>%
pivot_longer(cyl:carb) %>% #1
group_by(name) %>%
nest() %>% #2
mutate(model = map(data, ~flm(.x))) %>% #3
mutate(residuals = map(model, ~fres(.x))) %>% #4
unnest(residuals)
output
# A tibble: 320 x 4
# Groups: name [10]
name data model residuals
<chr> <list> <list> <dbl>
1 cyl <tibble [32 x 2]> <lm> 0.370
2 cyl <tibble [32 x 2]> <lm> 0.370
3 cyl <tibble [32 x 2]> <lm> -3.58
4 cyl <tibble [32 x 2]> <lm> 0.770
5 cyl <tibble [32 x 2]> <lm> 3.82
6 cyl <tibble [32 x 2]> <lm> -2.53
7 cyl <tibble [32 x 2]> <lm> -0.578
8 cyl <tibble [32 x 2]> <lm> -1.98
9 cyl <tibble [32 x 2]> <lm> -3.58
10 cyl <tibble [32 x 2]> <lm> -1.43
# ... with 310 more rows
As this can be a bit confusing I will show you step by step what is going on here (see comment numbers).
So let's see what we have after step one
# A tibble: 320 x 3
mpg name value
<dbl> <chr> <dbl>
1 21 cyl 6
2 21 disp 160
3 21 hp 110
4 21 drat 3.9
5 21 wt 2.62
6 21 qsec 16.5
7 21 vs 0
8 21 am 1
9 21 gear 4
10 21 carb 4
# ... with 310 more rows
It is rather simple. We just made the mtcars long.
After step two, we have something like this
# A tibble: 10 x 2
# Groups: name [10]
name data
<chr> <list>
1 cyl <tibble [32 x 2]>
2 disp <tibble [32 x 2]>
3 hp <tibble [32 x 2]>
4 drat <tibble [32 x 2]>
5 wt <tibble [32 x 2]>
6 qsec <tibble [32 x 2]>
7 vs <tibble [32 x 2]>
8 am <tibble [32 x 2]>
9 gear <tibble [32 x 2]>
10 carb <tibble [32 x 2]>
As you can see, each variable has its own tibble in which there are two variables mpg and value.
In the third step, we add the lm models.
# A tibble: 10 x 3
# Groups: name [10]
name data model
<chr> <list> <list>
1 cyl <tibble [32 x 2]> <lm>
2 disp <tibble [32 x 2]> <lm>
3 hp <tibble [32 x 2]> <lm>
4 drat <tibble [32 x 2]> <lm>
5 wt <tibble [32 x 2]> <lm>
6 qsec <tibble [32 x 2]> <lm>
7 vs <tibble [32 x 2]> <lm>
8 am <tibble [32 x 2]> <lm>
9 gear <tibble [32 x 2]> <lm>
10 carb <tibble [32 x 2]> <lm>
On the other hand, in step four of these models, we add the residues.
# A tibble: 10 x 4
# Groups: name [10]
name data model residuals
<chr> <list> <list> <list>
1 cyl <tibble [32 x 2]> <lm> <dbl [32]>
2 disp <tibble [32 x 2]> <lm> <dbl [32]>
3 hp <tibble [32 x 2]> <lm> <dbl [32]>
4 drat <tibble [32 x 2]> <lm> <dbl [32]>
5 wt <tibble [32 x 2]> <lm> <dbl [32]>
6 qsec <tibble [32 x 2]> <lm> <dbl [32]>
7 vs <tibble [32 x 2]> <lm> <dbl [32]>
8 am <tibble [32 x 2]> <lm> <dbl [32]>
9 gear <tibble [32 x 2]> <lm> <dbl [32]>
10 carb <tibble [32 x 2]> <lm> <dbl [32]>
This solution is very quick and transparent and allows you to save all the models that you can use for further calculations.
You can freely adapt the solution to your needs and perform calculations on selected variables.