我正在尝试使用purr软件包翻译此基本的for循环。想法是使用数据框元素作为参数来应用功能。
使用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 :: map的一般规范如何工作感到很陌生。 非常感谢。
编辑:
在这里,我使用了一个非常基本的示例,其中包含fcn
和param
,以了解如何在映射规范中包括函数参数(来自param
)。结果,我对嵌套没有特别的兴趣,只是对使用map的循环的平淡翻译感兴趣,该map可以对具有多个参数的任何功能之王起作用。
答案 0 :(得分:2)
如果我已正确理解,则想为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))
答案 1 :(得分:1)
您可以先将数据嵌套在制造商和年份中,然后使用一个函数进行映射,但以下情况除外,我直接使用了.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]>
如果要查看汇总结果:
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
答案 2 :(得分:0)
以下文章帮助我实现了预期的结果,该结果足够广泛地应用于许多情况并且忽略了嵌套:https://stackoverflow.com/a/52309113/10580543。
使用pmap:
output <- param %>% pmap(~fcn(.x, .y))