#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
и я могу напрямую перейти к своему коду. Мне это нравится!!