Лапли для dlply

#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 повторяйте элементы списка, чтобы вам не пришлось выполнять эту команду несколько раз.