magrittr 管道中的点符号不是

dot notation in magrittr pipe not be

我以为我理解了与 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

reprex package (v0.3.0)

于 2021 年 1 月 4 日创建

. 在这种情况下指的是存在于上一步中的数据,即 (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)

这给出了与第一个示例相同的输出。

请注意,您可以使用 . 来引用分组数据 group_modify 而不是 summarise:

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

* 只是一个替代方案 - 我认为列表列 + unnest-变体现在被认为是更好的方法。