【问题标题】:Translating a 'for loop' to 'purr::map'将“for循环”翻译成“purr::map”
【发布时间】:2020-05-27 16:19:53
【问题描述】:

我正在尝试使用 purr 包翻译这个基本的 for 循环。这个想法是应用一个使用数据框元素作为参数的函数。

使用来自ggplot2mpg 数据集创建要循环的数据框:

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

以及为每个many 组合应用fcn 的循环:

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

我对 purr 很陌生,并且很纠结 purr::map 的一般规范是如何工作的。 非常感谢。

编辑: 我在这里使用了fcnparam 的一个非常基本的示例,以了解如何在地图规范中包含函数参数(来自param)。结果,我对事先的嵌套并不特别感兴趣,而只是使用 map 对循环进行枯燥的翻译,它可以适用于任何具有多个参数的函数之王。

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    如果我理解正确,您想根据hwy 为每个yearmanufacturer 组合建模cty

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

    【讨论】:

    • RStudio 的 purrr 备忘单是一个非常简洁但很有帮助的资源。
    • 感谢您的回答!我发布了一个替代方案,仅用于将循环转换为 purr。
    【解决方案2】:

    您可以先将数据嵌套在制造商和年份中,然后使用函数进行映射,除了下面,我直接使用了.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
    

    【讨论】:

    • 感谢您的回答。我编辑了这篇文章,提到我正在寻找一些非常通用的东西来帮助我理解具有多个参数的函数的正确 purr 规范。
    【解决方案3】:

    以下帖子帮助我实现了预期的结果,足以在许多情况下应用并忽略嵌套:https://stackoverflow.com/a/52309113/10580543

    使用 pmap:

    output <- param %>% pmap(~fcn(.x, .y)) 
    

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2022-06-14
      相关资源
      最近更新 更多