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

使用purr::map为多个列排列dplyr::spread

  •  0
  • MYaseen208  · 技术社区  · 6 年前

    我想得到 dplyr::spread 对于多个列,使用 purrr::map 进入data.frames列表。想知道如何达到预期的效果?

    library(tidyverse)
    mtcars %>%
      dplyr::group_by(gear, carb) %>%
      dplyr::summarise_at(
        .vars = names(.)[1:9]
        , .funs = c("mean")
      ) %>%
      dplyr::select(gear, carb, mpg) %>%
      tidyr::spread(key = "gear", value = mpg)
    
    # A tibble: 6 x 4
       carb   `3`   `4`   `5`
      <dbl> <dbl> <dbl> <dbl>
    1     1  20.3  29.1  NA  
    2     2  17.2  24.8  28.2
    3     3  16.3  NA    NA  
    4     4  12.6  19.8  15.8
    5     6  NA    NA    19.7
    6     8  NA    NA    15  
    
    mtcars %>%
      dplyr::group_by(gear, carb) %>%
      dplyr::summarise_at(
        .vars = names(.)[1:9]
        , .funs = c("mean")
      ) %>%
      dplyr::select(gear, carb, disp) %>%
      tidyr::spread(key = "gear", value = disp) 
    
    
    # A tibble: 6 x 4
       carb   `3`   `4`   `5`
      <dbl> <dbl> <dbl> <dbl>
    1     1  201.  84.2   NA 
    2     2  346. 121.   108.
    3     3  276.  NA     NA 
    4     4  416. 164.   351 
    5     6   NA   NA    145 
    6     8   NA   NA    301 
    

    现在我想用一个命令执行两个进程 Purrr::地图 。不知道这是怎么实现的。

    mtcars %>%
      dplyr::group_by(gear, carb) %>%
      dplyr::summarise_at(
        .vars = names(.)[1:9]
        , .funs = c("mean")
      ) %>%
      dplyr::select(gear, carb, mpg, disp) %>%
      purrr::map(.f = ~ tidyr::spread(data = mtcars,  key = "gear", value = .x))
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Calum You    6 年前

    所以这里的关键是要映射的列表实际上是列名,而不是列或数据帧本身。这里有一个粗略的、现成的方法,尽管它非常脆弱(数据帧和分组列都是硬编码到函数中的)。如果您需要做任何更有趣的事情,可以查看dplyr vignette的编程。

    library(tidyverse)
    to_spread <- mtcars %>%
      group_by(gear, carb) %>%
      summarise_all(mean)
    
    map(
      .x = colnames(to_spread)[3:11],
      .f = function(col) {
        to_spread %>%
          select(gear, carb, col) %>%
          spread(gear, col)
      }
    ) %>%
      set_names(colnames(to_spread)[3:11]) %>%
      head(3)
    #> $mpg
    #> # A tibble: 6 x 4
    #>    carb   `3`   `4`   `5`
    #>   <dbl> <dbl> <dbl> <dbl>
    #> 1     1  20.3  29.1  NA  
    #> 2     2  17.2  24.8  28.2
    #> 3     3  16.3  NA    NA  
    #> 4     4  12.6  19.8  15.8
    #> 5     6  NA    NA    19.7
    #> 6     8  NA    NA    15  
    #> 
    #> $cyl
    #> # A tibble: 6 x 4
    #>    carb   `3`   `4`   `5`
    #>   <dbl> <dbl> <dbl> <dbl>
    #> 1     1  5.33     4    NA
    #> 2     2  8        4     4
    #> 3     3  8       NA    NA
    #> 4     4  8        6     8
    #> 5     6 NA       NA     6
    #> 6     8 NA       NA     8
    #> 
    #> $disp
    #> # A tibble: 6 x 4
    #>    carb   `3`   `4`   `5`
    #>   <dbl> <dbl> <dbl> <dbl>
    #> 1     1  201.  84.2   NA 
    #> 2     2  346. 121.   108.
    #> 3     3  276.  NA     NA 
    #> 4     4  416. 164.   351 
    #> 5     6   NA   NA    145 
    #> 6     8   NA   NA    301
    

    于2018年6月22日由 reprex package (v0.2.0)。