dplyr::spread 用于使用 purrr::map 的多列

dplyr::spread for multiple columns using purrr::map

我想使用 purrr::map 将多个列的 dplyr::spread 放入 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::map 通过单个命令执行这两个过程。想知道这是如何实现的。

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

所以这里的关键是你想要映射的列表实际上是列名,而不是列或数据框本身。这是一个粗略而现成的方法,可以做你想做的事,尽管它非常脆弱(数据框和分组列都被硬编码到函数中)。如果您需要做任何更花哨的事情,您可以使用 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

reprex package (v0.2.0) 创建于 2018-06-22。