繁体   English   中英

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

[英]dplyr::spread for multiple columns using purrr::map

我想使用purrr::mapdplyr::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小插图来进行编程。

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软件包 (v0.2.0)于2018-06-22创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM