точечная нотация в канале magrittr отсутствует

#r #dplyr #magrittr #broom

#r #dplyr #magrittr #метла

Вопрос:

Я думал, что понял, что в сочетании с каналом magrittr точечная нотация указывает, куда должен идти набор данных, передаваемый в функцию, для оценки. Когда я начинал работать с purrr / broom для генерации некоторых вложенных фреймов данных с линейными моделями, которые я создавал по группе, я столкнулся с проблемой. При использовании точечной нотации кажется, что моя предыдущая group_by команда игнорировалась. Мне потребовалось некоторое время, чтобы понять, что я должен просто опустить точечную нотацию, и она работает так, как ожидалось, но я хотел бы понять, почему она не работает.

Вот пример кода, который, как я ожидал, будет генерировать идентичные данные, но только первый пример генерирует линейные модели по группам, в то время как второй генерирует модель для всего набора данных, но затем все равно сохраняет ее на уровне группы.

 #// library and data prep
library(tidyverse)
library(broom)
data <- as_tibble(mtcars)

#// generates lm fit for the model by group
data %>%
    #// group by factor
    group_by(carb) %>%
    #// summary for the grouped dataset
    summarize(new = list( tidy( lm(formula = drat ~ mpg)))) %>%
    #// unnest
    unnest(cols = new) 
#> Warning in summary.lm(x): essentially perfect fit: summary may be unreliable
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 12 x 6
#>     carb term         estimate  std.error  statistic    p.value
#>    <dbl> <chr>           <dbl>      <dbl>      <dbl>      <dbl>
#>  1     1 (Intercept)  1.72e  0   5.85e- 1   2.94e  0   3.24e- 2
#>  2     1 mpg          7.75e- 2   2.26e- 2   3.44e  0   1.85e- 2
#>  3     2 (Intercept)  1.44e  0   5.87e- 1   2.46e  0   3.95e- 2
#>  4     2 mpg          1.01e- 1   2.55e- 2   3.95e  0   4.26e- 3
#>  5     3 (Intercept)  3.07e  0   6.86e-15   4.48e 14   1.42e-15
#>  6     3 mpg          3.46e-17   4.20e-16   8.25e- 2   9.48e- 1
#>  7     4 (Intercept)  2.18e  0   4.29e- 1   5.07e  0   9.65e- 4
#>  8     4 mpg          8.99e- 2   2.65e- 2   3.39e  0   9.43e- 3
#>  9     6 (Intercept)  3.62e  0 NaN        NaN        NaN       
#> 10     6 mpg         NA         NA         NA         NA       
#> 11     8 (Intercept)  3.54e  0 NaN        NaN        NaN       
#> 12     8 mpg         NA         NA         NA         NA

#// generates lm fit for the whole model
data %>%
    #// group by factor
    group_by(carb) %>%
    #// summary for the whole dataset
    summarize(new = list( tidy( lm(formula = drat ~ mpg, data = .)))) %>%
    #// unnest
    unnest(cols = new)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 12 x 6
#>     carb term        estimate std.error statistic  p.value
#>    <dbl> <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#>  1     1 (Intercept)   2.38      0.248       9.59 1.20e-10
#>  2     1 mpg           0.0604    0.0119      5.10 1.78e- 5
#>  3     2 (Intercept)   2.38      0.248       9.59 1.20e-10
#>  4     2 mpg           0.0604    0.0119      5.10 1.78e- 5
#>  5     3 (Intercept)   2.38      0.248       9.59 1.20e-10
#>  6     3 mpg           0.0604    0.0119      5.10 1.78e- 5
#>  7     4 (Intercept)   2.38      0.248       9.59 1.20e-10
#>  8     4 mpg           0.0604    0.0119      5.10 1.78e- 5
#>  9     6 (Intercept)   2.38      0.248       9.59 1.20e-10
#> 10     6 mpg           0.0604    0.0119      5.10 1.78e- 5
#> 11     8 (Intercept)   2.38      0.248       9.59 1.20e-10
#> 12     8 mpg           0.0604    0.0119      5.10 1.78e- 5
 

Создано 2021-01-04 пакетом reprex (версия 0.3.0)

Ответ №1:

. в данном случае относится к данным, которые присутствуют на предыдущем шаге, который является ( data %>% group_by(carb) ). Несмотря на то, что данные сгруппированы, они по-прежнему являются полными данными. Если вы dplyr используете> 1.0.0, вы можете использовать cur_data() для ссылки на данные в группе.

 library(dplyr)
library(broom)
library(tidyr)

data %>%
  group_by(carb) %>%
  summarize(new = list(tidy(lm(formula = drat ~ mpg, data = cur_data())))) %>%
  unnest(cols = new)
 

Это дает тот же результат, что и в вашем первом примере.

Комментарии:

1. Ах, так . что это просто данные, но группировка на самом деле не закодирована в этом. И спасибо также за то, что указали мне на функцию cur_data(), которая выглядит так, как будто она и другие cur_xxx() ее родственники могут оказаться действительно полезными.

Ответ №2:

Обратите внимание, что вы можете использовать . для ссылки на сгруппированные данные с group_modify помощью вместо summarise :

 data %>%
  group_by(carb) %>%
  group_modify(~lm(formula = drat ~ mpg, data = .) %>% tidy) 
 

* Просто альтернатива — я думаю, что варианты list-columns unnest — считаются лучшим подходом сейчас.

Комментарии:

1. О, здорово. Это также действительно полезно. Спасибо!

2. Таким образом, это позволяет мне пропустить перенос вывода tidy в a list , чтобы сделать один элемент совместимым, summarize и я могу напрямую перейти к своему коду. Мне это нравится!!