【问题标题】:Lapply for dlply申请dlply
【发布时间】:2021-10-15 16:25:09
【问题描述】:

我正在尝试对数据框列表应用线性回归,并针对特定值进行过滤。 例如,有一个 Iris 数据框列表,我尝试对 Sepal.Length ~ Sepal.Width 运行回归,每个物种运行不同的回归。

test <- dlply(iris, "Species", function(x) lm(Sepal.Length ~ Sepal.Width, data = x))

但我想同时为数据帧列表执行此操作,而不是单独执行此操作。所以,假设我有一个包含多个 iris 数据框的列表:

 iris1 <- iris
 iris2 <- iris
 iris3 <- iris
iris_list <- list(iris1, iris2, iris3) 

所以,要将 dlply 代码运行到 iris_list,我迷路了。

【问题讨论】:

  • 为什么不试试lapply
  • 我试过但无法运行。

标签: r plyr lm


【解决方案1】:

使用lapply

res = lapply(iris_list, function(x){
  test <- dlply(x, "Species", function(x) lm(Sepal.Length ~ Sepal.Width, data = x))
  return(test)
})

【讨论】:

  • 这似乎有效。谢谢!我试图用 lapply 来做,但显然是用错误的方式做的; lapply(data_list,dlply(data_list, "UF", function(x) lm(VD4020~V2007, data = x))
【解决方案2】:

咕噜声

如果您想跨数据框列表应用回归,请尝试使用 purrr::map

library(purrr)

map(iris_list, ~ lm(Sepal.Length ~ Sepal.Width, data = .x))

如果你想根据一个因素将一个数据框拆分成一个列表,你可以首先使用 base R 中的split

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)))

【讨论】:

  • 但是我遇到了同样的问题,必须手动对列表中的所有数据框运行该命令。
  • @Lelleo 你能试着澄清更多吗? mapimaplapply 迭代 列表元素,因此您不必多次运行该命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2013-02-23
  • 2011-08-31
  • 2013-07-17
  • 2011-07-21
相关资源
最近更新 更多