#r #plyr #lm
Вопрос:
Я пытаюсь применить линейную регрессию к списку кадров данных, отфильтрованных по определенному значению. Например, имея список кадров данных радужной оболочки глаза, я пытаюсь запустить регрессию для Sepal.Length ~ Sepal.Width
каждого вида , для которого выполняется другая регрессия.
test <- dlply(iris, "Species", function(x) lm(Sepal.Length ~ Sepal.Width, data = x))
но я хочу сделать это для списка кадров данных одновременно, а не по отдельности. Итак, допустим, у меня был список из нескольких кадров данных радужной оболочки глаза:
iris1 <- iris
iris2 <- iris
iris3 <- iris
iris_list <- list(iris1, iris2, iris3)
Итак, чтобы запустить код iris_list
dlply , я заблудился.
Комментарии:
1. Почему бы не попробовать
lapply
?2. Я пытался, но не смог запустить его.
Ответ №1:
С помощью lapply
,
res = lapply(iris_list, function(x){
test <- dlply(x, "Species", function(x) lm(Sepal.Length ~ Sepal.Width, data = x))
return(test)
})
Комментарии:
1. Похоже, это сработало. Спасибо! Я пытался сделать это с помощью lapply,но явно сделал это неправильно; lapply(data_list, dlply(data_list, «UF», функция(x) lm(VD4020~V2007, данные = x) )
Ответ №2:
мурррр
Попробуйте использовать purrr::map
, если вы хотите применить регрессию к списку фреймов данных:
library(purrr)
map(iris_list, ~ lm(Sepal.Length ~ Sepal.Width, data = .x))
Если вы хотите разделить фрейм данных на список на основе коэффициента, который вы можете использовать split
сначала с базы R:
imap(split(iris, ~ Species), ~ lm(Sepal.Length ~ Sepal.Width, data = .x))
Примечание: imap
используется в данном случае для сохранения имен списков, которые Species
в данном случае являются уровнями.
основание R
Если вы хотите использовать только базу R, и lapply
тогда это сработает:
lapply(split(iris, ~ Species), function(x) lm(Sepal.Length ~ Sepal.Width, data = x))
Если у вас есть вложенный список, вам нужно вложить свое сопоставление:
library(purrr)
map(iris_list, ~ imap(split(.x, ~ Species), ~ lm(Sepal.Length ~ Sepal.Width, data = .x)))
И снова в базе R:
lapply(iris_list, function(x) lapply(split(x, ~ Species), function(y) lm(Sepal.Length ~ Sepal.Width, data = y)))
Комментарии:
1. Но затем я сталкиваюсь с той же проблемой, что и при выполнении этой команды для всех фреймов данных в списке вручную.
2.@Lelleo не могли бы вы попытаться уточнить подробнее?
map
,imap
, иlapply
повторяйте элементы списка, чтобы вам не пришлось выполнять эту команду несколько раз.