代码之家  ›  专栏  ›  技术社区  ›  user23485480

对咕噜的补充论点:地图不能按预期工作

  •  0
  • user23485480  · 技术社区  · 2 年前

    我正在使用grur::map函数迭代几列并整理结果。作为一个简短的例子,我提供了以下代码:

    library(tidymodels)
    library(broom)
    
    > penguins %>% 
    +   select(where(is.numeric)) %>% 
    +   map(\(x) lm(x ~ penguins$species, .)) %>% 
    +   map_df(broom::tidy, .id = "var")
    # A tibble: 12 × 6
       var               term                       estimate std.error statistic   p.value
       <chr>             <chr>                         <dbl>     <dbl>     <dbl>     <dbl>
     1 bill_length_mm    (Intercept)                 38.8       0.241    161.    2.47e-322
     2 bill_length_mm    penguins$speciesChinstrap   10.0       0.432     23.2   4.23e- 72
     3 bill_length_mm    penguins$speciesGentoo       8.71      0.360     24.2   5.33e- 76
     4 bill_depth_mm     (Intercept)                 18.3       0.0912   201.    0        
     5 bill_depth_mm     penguins$speciesChinstrap    0.0742    0.164      0.453 6.50e-  1
     6 bill_depth_mm     penguins$speciesGentoo      -3.36      0.136    -24.7   7.93e- 78
     7 flipper_length_mm (Intercept)                190.        0.540    351.    0        
     8 flipper_length_mm penguins$speciesChinstrap    5.87      0.970      6.05  3.79e-  9
     9 flipper_length_mm penguins$speciesGentoo      27.2       0.807     33.8   1.84e-110
    10 body_mass_g       (Intercept)               3701.       37.6       98.4   2.49e-251
    11 body_mass_g       penguins$speciesChinstrap   32.4      67.5        0.480 6.31e-  1
    12 body_mass_g       penguins$speciesGentoo    1375.       56.1       24.5   5.42e- 77
    

    这正如预期的那样。

    然而,通常当我用额外的参数映射函数时,我会使用匿名函数,如 doc . 当我在这个例子中尝试它时,只从以前的代码中更改代码的最后一行,我得到了一个整洁的表,其中包含所有regerssions结果,但没有“var”列,它告诉我回归中包含的变量

    > penguins %>% 
    +   select(where(is.numeric)) %>% 
    +   map(\(x) lm(x ~ penguins$species, .)) %>% 
    +   map_df(\(x) broom::tidy(x, .id = "var"))
    # A tibble: 12 × 5
       term                       estimate std.error statistic   p.value
       <chr>                         <dbl>     <dbl>     <dbl>     <dbl>
     1 (Intercept)                 38.8       0.241    161.    2.47e-322
     2 penguins$speciesChinstrap   10.0       0.432     23.2   4.23e- 72
     3 penguins$speciesGentoo       8.71      0.360     24.2   5.33e- 76
     4 (Intercept)                 18.3       0.0912   201.    0        
     5 penguins$speciesChinstrap    0.0742    0.164      0.453 6.50e-  1
     6 penguins$speciesGentoo      -3.36      0.136    -24.7   7.93e- 78
     7 (Intercept)                190.        0.540    351.    0        
     8 penguins$speciesChinstrap    5.87      0.970      6.05  3.79e-  9
     9 penguins$speciesGentoo      27.2       0.807     33.8   1.84e-110
    10 (Intercept)               3701.       37.6       98.4   2.49e-251
    11 penguins$speciesChinstrap   32.4      67.5        0.480 6.31e-  1
    12 penguins$speciesGentoo    1375.       56.1       24.5   5.42e- 77
    > penguins %>% 
    +   select(where(is.numeric)) %>% 
    +   map(\(x) lm(x ~ penguins$species, .)) %>% 
    +   map_df(~ broom::tidy(.x, .id = "var"))
    # A tibble: 12 × 5
       term                       estimate std.error statistic   p.value
       <chr>                         <dbl>     <dbl>     <dbl>     <dbl>
     1 (Intercept)                 38.8       0.241    161.    2.47e-322
     2 penguins$speciesChinstrap   10.0       0.432     23.2   4.23e- 72
     3 penguins$speciesGentoo       8.71      0.360     24.2   5.33e- 76
     4 (Intercept)                 18.3       0.0912   201.    0        
     5 penguins$speciesChinstrap    0.0742    0.164      0.453 6.50e-  1
     6 penguins$speciesGentoo      -3.36      0.136    -24.7   7.93e- 78
     7 (Intercept)                190.        0.540    351.    0        
     8 penguins$speciesChinstrap    5.87      0.970      6.05  3.79e-  9
     9 penguins$speciesGentoo      27.2       0.807     33.8   1.84e-110
    10 (Intercept)               3701.       37.6       98.4   2.49e-251
    11 penguins$speciesChinstrap   32.4      67.5        0.480 6.31e-  1
    12 penguins$speciesGentoo    1375.       56.1       24.5   5.42e- 77
    

    这种行为的原因是什么?

    1 回复  |  直到 2 年前
        1
  •  2
  •   shs    2 年前

    问题是 .id = "var" 不是一个论点 broom::tidy ,但为了 purrr::map_df() .引擎盖下 咕噜::map_df() 就像 purrr::map() ,返回一个列表。但随后它召唤 dplyr::bind_rows() ,创建数据帧。这个 .id 参数被传递给该函数。当你提供 .id bind_rows() ,它将列表的名称转换为列,列名称在 .id 论点 broom::tidy() 丢弃 .id 除非整理方法有这样的参数。这就是你错过专栏的原因。

    推荐文章