Как избежать использования цикла for для получения элементов вложенного списка на верхний уровень? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь извлечь коэффициенты из набора линейных моделей в кадр данных.Как извлечь эти значения без использования цикла for?

Данные в моем примере для простоты являются фиктивными.Фактический проект создает модели для температуры воздуха для каждого дня года, а затем пытается моделировать параметры этих моделей.В настоящее время я могу только накапливать каждый коэффициент в отдельной переменной, а затем индивидуально применять его к моему набору данных:

require(tidyverse)

# making different mpg models from displacement, distinguished by cylinder count
models <- mtcars %>% 
  nest(-cyl, .key = "cardata") %>% 
  mutate(mod = map(cardata, ~lm(mpg ~ disp, data = .))) %>% 
  mutate(coefficients = map(mod, coefficients))    #this only extracts a list of coefficients

# currently using one for-loop to extract each coefficient, looking for a more elegant way...
coef.intercept <- c()
for (i in models$coefficients) {
  coef.intercept <- c(coef.intercept,i[1])
}

coef.disp <- c()
for (i in models$coefficients) {
  coef.disp <- c(coef.disp,i[2])
}

# putting together the final data frame
models <- models %>% 
  mutate(coef.intercept) %>% 
  mutate(coef.disp) %>% 
  select(cyl, coef.intercept, coef.disp) %>% 
  as.data.frame()

Используя 'map', я могу извлечь список коэффициентов, но я не могу использовать '[оператор, чтобы получить конкретные элементы отдельных списков.Что-то вроде

mutate(models, coef.intercept = map(models, coefficients[1])) 

не работает, я получаю «Ошибка: индекс 1 должен иметь длину 1, а не 2».

1 Ответ

1 голос
/ 20 июня 2019

Я не могу сейчас воспроизвести ваш пример, но я думаю, что вы можете начать отсюда и адаптировать это решение к вашим потребностям.

A <- list(a = list(1,"j"), b = list(2, "k") ,  d = list(3, "m" ) ) 

sapply(A, `[[`, 1) 
...