r - dplyr::spread 使用 purrr::map 为多列传播
问题描述
我想使用data.frames 列表获取dplyr::spread
多个列。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))
解决方案
所以这里的关键是您要映射的列表实际上是列名,而不是列或数据框本身。这是一种粗略且现成的方法,可以满足您的需求,尽管它非常脆弱(数据框和分组列都被硬编码到函数中)。如果您需要做更多花哨的事情,您可以使用 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 包(v0.2.0) 于 2018 年 6 月 22 日创建。
推荐阅读
- vbscript - 并发调用脚本后将错误值写入日志文件
- javascript - 在 OpenLayers 和 Thymeleaf 中使用 Javascript 变量
- android - Oreo 无限后台服务,例如 Messenger 或 Instagram
- ios - 添加到 UIScrollView 时调整 UITextView 父 UIView 的大小
- python - 如何使用python一次重命名多个文件
- c# - 我的方法中的重载错误
- r - 如何在 R 中的同一个 dygraph 中绘制多个变量图
- jquery - 使用 jQuery 响应在新选项卡中打开 url
- javascript - 如何将文本区域中的换行符替换为
- laravel - 如何在phpunit测试期间检查断点数据库中的值