dplyr ::使用purrr :: map扩展多列

时间:2018-06-22 17:44:38

标签: r dplyr tidyverse purrr spread

我想使用dplyr::spread进入data.frames列表以获取多列的purrr::map。想知道如何达到预期的结果吗?

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

1 个答案:

答案 0 :(得分:2)

因此,这里的关键是要映射的列表实际上是列名,而不是列或数据框本身。尽管它非常脆弱(虽然数据框和分组列都已硬编码到函数中),但这是一种粗略而现成的方法可以满足您的要求。如果您需要做更多花哨的工作,可以考虑使用dplyr小插图进行编程。

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创建。