将 "for循环 "翻译成 "purr::map"。

问题描述 投票:0回答:1

我正试图使用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 对于每个 many 组合。

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

我对purr很陌生,很苦恼purr::map的一般规范怎么用。非常感谢。

EDIT : 我在这里用了一个非常基本的例子,用了 fcnparam 了解如何包含函数参数(从 param)里面的map规范。结果,我事先对嵌套并不是特别感兴趣,而只是用map对循环进行了枯燥的翻译,可以适用于任何多参数的函数王。

r purrr
1个回答
2
投票

如果我没有理解错的话,你想建立模型。cty 基于 hwy 对于每个 yearmanufacturer 的组合。

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
投票

你可以先在厂家和年份内嵌套数据,然后用函数进行映射,只不过下面我用的是 .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

0
投票

下面的帖子帮我达到了预期的效果,通用性很强,可以应用在很多情况下,而且忽略了嵌套。https:/stackoverflow.coma5230911310580543.

使用 pmap:

output <- param %>% pmap(~fcn(.x, .y)) 
© www.soinside.com 2019 - 2024. All rights reserved.