簡體   English   中英

magrittr pipe 中的點符號不是

[英]dot notation in magrittr pipe not be

我想我理解與 magrittr pipe 一起使用,點符號表示通過管道傳輸到 function 的數據集應該在哪里進行評估。 當我開始使用 purrr/broom 使用我按組生成的線性模型生成一些嵌套數據幀時,我遇到了一個問題。 使用點符號時,似乎我之前的group_by命令被忽略了。 我花了一段時間才弄清楚我應該簡單地省略點符號並且它可以像預期的那樣工作,但我想了解它為什么不起作用。

這是我希望生成相同數據的示例代碼,但只有第一個示例是按組生成線性模型,而第二個示例為整個數據集生成 model,但仍將其存儲在組級別。

#// 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

代表 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)

這給出了與您的第一個示例相同的 output。

請注意,您可以使用. 使用group_modify而不是summarise引用分組數據:

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

* 只是一種選擇 - 我認為 list-columns + unnest -variants 現在被認為是更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM