Запуск модели lm для каждого df отдельно

#r #dplyr

#r #dplyr

Вопрос:

Я пытаюсь запустить другую модель для каждого df и сохранить все это в том же df после вложения.

Пример кода:

 mt<- mtcars %>% group_by(cyl,am) %>% nest() %>% 
  mutate(formula = "Add separate model for each row in text like mpg~wt for one row, mpg~wt hp for another etc.")

mt$formula[[1]] <- "mpg~wt"
mt$formula[[2]] <- "mpg~wt drat"
mt$formula[[3]] <- "mpg~wt qsec"
mt$formula[[4]] <- "mpg~wt gear"
mt$formula[[5]] <- "mpg~wt"

mt<- mutate(model = ?)
  

Комментарии:

1. 6-я строка не является формулой

Ответ №1:

Мы можем использовать map2 для перебора list столбца «данные» и соответствующих элементов «формулы», применить lm и назначить его обратно в новый столбец «модель»

 library(purrr)
mt$model <- vector('list', nrow(mt))
mt$model[1:5] <- map2(mt$data[1:5], mt$formula[1:5], ~ lm(.y, data = .x))
mt
# A tibble: 6 x 5
# Groups:   cyl, am [6]
#    cyl    am data              formula                                                                                  model
#  <dbl> <dbl> <list>            <chr>                                                                                    <lis>
#1     6     1 <tibble [3 × 9]>  mpg~wt                                                                                   <lm> 
#2     4     1 <tibble [8 × 9]>  mpg~wt drat                                                                              <lm> 
#3     6     0 <tibble [4 × 9]>  mpg~wt qsec                                                                              <lm> 
#4     8     0 <tibble [12 × 9]> mpg~wt gear                                                                              <lm> 
#5     4     0 <tibble [3 × 9]>  mpg~wt                                                                                   <lm> 
#6     8     1 <tibble [2 × 9]>  Add separate model for each row in text like mpg~wt for one row, mpg~wt hp for another … <NUL…
  

Комментарии:

1. Спасибо. У меня есть пара более общих вопросов. Почему формула должна быть списком? И есть ли более элегантный способ, чем указывать номера строк df (например, по условиям строки) при добавлении формулы?

2. @Stat. В вашем случае это строка, и ей не обязательно быть list . т. Е. у вас может быть обычный столбец.

3. Спасибо. Как насчет этого в качестве опции редактирования (не работает, но в этом смысл кода) mt$cyl[6]$am[1]$model <- "mpg~wt"

4. @Stat. Энтузиазм. Я не понял показанный вами код и входные данные. mt$cyl[6]$am[1] . Здесь ‘cyl’ — это другой столбец, а ‘am’ — другой

5. Я говорю, что вместо указания просто числа строк, равного 1, чтобы сделать код более читаемым, я пытаюсь выделить модель, указав cyl и am и вставив модель. Простите меня за «псевдод»