Перевод 'for l oop' в 'purr :: map' - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь перевести этот базовый c на l oop с помощью пакета purr. Идея состоит в том, чтобы применить функцию, используя элементы фрейма данных в качестве параметров.

Создание фрейма данных для l oop с использованием набора данных 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)
}

И l oop для применения fcn для каждой комбинации man и y:

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

Я очень новичок, чтобы мурлыкать и бороться с тем, как работают общие спецификации purr :: map. Большое спасибо.

РЕДАКТИРОВАТЬ: Я использовал здесь очень простой пример c с fcn и param, чтобы понять, как включить параметры функции (из param) в спецификацию карты. В результате я не особо интересовался вложением заранее, а только скучным переводом l oop using map, который мог работать для любого короля функций с несколькими параметрами.

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Если я правильно понял, вы хотите смоделировать 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 голос
/ 27 мая 2020

Вы можете сначала вложить данные в производителя и год, а затем сопоставить с помощью функции, за исключением того, что я использовал непосредственно .x, который будет каждым элементом данных, через которые вы сопоставляете. Вы также можете использовать tidy() from broom, чтобы поместить результат 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
0 голосов
/ 28 мая 2020

Следующий пост помог мне достичь желаемого результата, достаточно общего, чтобы его можно было применять во многих ситуациях и игнорировать вложенность: { ссылка }.

Использование pmap:

output <- param %>% pmap(~fcn(.x, .y)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...