【问题标题】:pass all column names to pmap() inside mutate()将所有列名传递给 mutate() 中的 pmap()
【发布时间】:2021-02-11 01:27:02
【问题描述】:

当在mutate 中执行pmap 时,我经常喜欢使用以下构造,以便可以引用map 函数中的普通列名,而不是..1..2 等。必须跟踪我给它们的顺序:

library(tidyverse)

mtcars %>%
  nest(data = -c(vs, am, gear, carb)) %>%
  mutate(plot = pmap(lst(vs, am, gear, carb, data), ~with(list(...), {
    
    # not relevant to question, just example task:
    ggplot(data = data, aes(x = wt, y = mpg)) + geom_point() +
      labs(subtitle = (paste0("am=", am, "\n",
                             "carb=", carb, "\n",
                             "gear=", gear, "\n",
                             "vs=", vs)))
  })))
#> # A tibble: 14 x 6
#>       vs    am  gear  carb data             plot  
#>    <dbl> <dbl> <dbl> <dbl> <list>           <list>
#>  1     0     1     4     4 <tibble [2 x 7]> <gg>  
#>  2     1     1     4     1 <tibble [4 x 7]> <gg>  
#>  3     1     0     3     1 <tibble [3 x 7]> <gg>  
#>  4     0     0     3     2 <tibble [4 x 7]> <gg>  
#>  5     0     0     3     4 <tibble [5 x 7]> <gg>  
#>  6     1     0     4     2 <tibble [2 x 7]> <gg>  
#>  7     1     0     4     4 <tibble [2 x 7]> <gg>  
#>  8     0     0     3     3 <tibble [3 x 7]> <gg>  
#>  9     1     1     4     2 <tibble [2 x 7]> <gg>  
#> 10     0     1     5     2 <tibble [1 x 7]> <gg>  
#> 11     1     1     5     2 <tibble [1 x 7]> <gg>  
#> 12     0     1     5     4 <tibble [1 x 7]> <gg>  
#> 13     0     1     5     6 <tibble [1 x 7]> <gg>  
#> 14     0     1     5     8 <tibble [1 x 7]> <gg>

我的问题是,我可以在 lst() 中放入什么以便将所有列传递给映射函数,而不是像上面那样写出所有列?我尝试了names(.)!!!names(.) 作为我的第一次尝试。或者,如果有更简洁的方法来做到这一点,比如不使用lst(),那也可以。

【问题讨论】:

    标签: r dplyr purrr tibble tidyeval


    【解决方案1】:

    要传递所有内容,您只需使用 . 而无需单独指定每一列。

    library(tidyverse)
    
    mtcars %>%
      nest(data = -c(vs, am, gear, carb)) %>%
      mutate(plot = pmap(., ~with(list(...), {
        # not relevant to question, just example task:
        ggplot(data = data, aes(x = wt, y = mpg)) + geom_point() +
          labs(subtitle = (paste0("am=", am, "\n",
                                  "carb=", carb, "\n",
                                  "gear=", gear, "\n",
                                  "vs=", vs)))
      })))
    
    #      vs    am  gear  carb data             plot  
    #   <dbl> <dbl> <dbl> <dbl> <list>           <list>
    # 1     0     1     4     4 <tibble [2 × 7]> <gg>  
    # 2     1     1     4     1 <tibble [4 × 7]> <gg>  
    # 3     1     0     3     1 <tibble [3 × 7]> <gg>  
    # 4     0     0     3     2 <tibble [4 × 7]> <gg>  
    # 5     0     0     3     4 <tibble [5 × 7]> <gg>  
    # 6     1     0     4     2 <tibble [2 × 7]> <gg>  
    # 7     1     0     4     4 <tibble [2 × 7]> <gg>  
    # 8     0     0     3     3 <tibble [3 × 7]> <gg>  
    # 9     1     1     4     2 <tibble [2 × 7]> <gg>  
    #10     0     1     5     2 <tibble [1 × 7]> <gg>  
    #11     1     1     5     2 <tibble [1 × 7]> <gg>  
    #12     0     1     5     4 <tibble [1 × 7]> <gg>  
    #13     0     1     5     6 <tibble [1 × 7]> <gg>  
    #14     0     1     5     8 <tibble [1 × 7]> <gg>  
    

    【讨论】:

    • 请注意,这不适用于分组数据帧:pmap() 将每组评估一次,但将接收整个数据帧(通过 magrittr . 占位符),而不仅仅是一个分组切片。
    • 在哪种情况下最好使用cur_data()
    • 哦,是的,我想是的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2018-01-15
    • 1970-01-01
    • 2019-07-23
    • 2017-04-15
    相关资源
    最近更新 更多