我正试图使用purr包来翻译这个基本的for循环。我们的想法是使用数据帧元素作为参数来应用一个函数。
使用purr包创建要循环的数据帧。mpg
数据集来自 ggplot2
:
param <- mpg %>% select(manufacturer, year) %>% distinct() %>% rename(man = manufacturer, y = year)
要应用的函数。
fcn <- function(man, y) {
df <- mpg %>% filter(manufacturer == man & year == y)
mod <- lm(data = df, cty ~ hwy)
out <- summary(mod)
return(out)
}
以及要应用的循环 fcn
对于每个 man
和 y
组合。
for (i in 1:nrow(param)) {
fcn(man = param$man[i],
y = param$y[i])
}
我对purr很陌生,很苦恼purr::map的一般规范怎么用。非常感谢。
EDIT : 我在这里用了一个非常基本的例子,用了 fcn
和 param
了解如何包含函数参数(从 param
)里面的map规范。结果,我事先对嵌套并不是特别感兴趣,而只是用map对循环进行了枯燥的翻译,可以适用于任何多参数的函数王。
如果我没有理解错的话,你想建立模型。cty
基于 hwy
对于每个 year
和 manufacturer
的组合。
library(tidyverse)
library(ggplot2)
library(purrr)
我已经修改了你的函数定义,以适应于 map
功能设置。
fcn <- function(df){
mod <- lm(data = df, cty ~ hwy)
return(summary(mod))
}
下面的代码应该产生各年份和制造商的型号汇总。
mpg %>% group_by(manufacturer, year) %>%
nest() %>% mutate(model = map(data, fcn))
你可以先在厂家和年份内嵌套数据,然后用函数进行映射,只不过下面我用的是 .x
直接使用,这将是你映射过的数据的每个元素。你也可以使用 tidy()
扫帚把 summary()
的结果变成一个data.frame。
library(purrr)
library(tidyr)
library(dplyr)
library(broom)
mpg = ggplot2::mpg
result = mpg %>%
select(manufacturer, year,cty,hwy) %>%
nest(data=c(cty, hwy)) %>%
mutate(
model=map(data,~lm(cty ~ hwy,data=.x)),
summary=map(model,~tidy(summary(.x)))
)
# A tibble: 30 x 5
manufacturer year data model summary
<chr> <int> <list> <list> <list>
1 audi 1999 <tibble [9 × 2]> <lm> <tibble [2 × 5]>
2 audi 2008 <tibble [9 × 2]> <lm> <tibble [2 × 5]>
3 chevrolet 2008 <tibble [12 × 2]> <lm> <tibble [2 × 5]>
4 chevrolet 1999 <tibble [7 × 2]> <lm> <tibble [2 × 5]>
5 dodge 1999 <tibble [16 × 2]> <lm> <tibble [2 × 5]>
6 dodge 2008 <tibble [21 × 2]> <lm> <tibble [2 × 5]>
如果你想看一下summary的结果..:
result %>% unnest(summary)
# A tibble: 55 x 9
manufacturer year data model term estimate std.error statistic p.value
<chr> <int> <list> <list> <chr> <dbl> <dbl> <dbl> <dbl>
1 audi 1999 <tibbl… <lm> (Inte… -5.85 6.15 -0.951 3.73e-1
2 audi 1999 <tibbl… <lm> hwy 0.879 0.235 3.74 7.27e-3
3 audi 2008 <tibbl… <lm> (Inte… -0.5 3.68 -0.136 8.96e-1
4 audi 2008 <tibbl… <lm> hwy 0.695 0.137 5.08 1.43e-3
下面的帖子帮我达到了预期的效果,通用性很强,可以应用在很多情况下,而且忽略了嵌套。https:/stackoverflow.coma5230911310580543.
使用 pmap:
output <- param %>% pmap(~fcn(.x, .y))