将“ for循环”转换为“ purr :: map”

时间:2020-05-27 16:19:53

标签: r purrr

我正在尝试使用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)
}

以及为每个fcnman组合应用y的循环:

for (i in 1:nrow(param)) {
    fcn(man = param$man[i], 
        y = param$y[i])
}

我对发出Purr :: map的一般规范如何工作感到很陌生。 非常感谢。

编辑: 在这里,我使用了一个非常基本的示例,其中包含fcnparam,以了解如何在映射规范中包括函数参数(来自param)。结果,我对嵌套没有特别的兴趣,只是对使用map的循环的平淡翻译感兴趣,该map可以对具有多个参数的任何功能之王起作用。

3 个答案:

答案 0 :(得分:2)

如果我已正确理解,则想为ctyhwy的每个组合基于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))