r - purrr::map 变体返回长 data.frame
问题描述
两者兼而有之purrr::map_dfr
,purrr::map_dfc
广而告之data.frame
。
library(tidyverse)
mtcars %>%
map_dfr(~is.na(.) %>% mean)
mtcars %>%
map_dfc(~is.na(.) %>% mean)
两者都返回
# A tibble: 1 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0 0 0 0 0 0 0 0 0 0 0
我可以用一个tidyr::gather
mtcars %>%
map_dfr(~is.na(.) %>% mean) %>%
gather
返回
# A tibble: 11 x 2
key value
<chr> <dbl>
1 mpg 0
2 cyl 0
3 disp 0
4 hp 0
5 drat 0
6 wt 0
7 qsec 0
8 vs 0
9 am 0
10 gear 0
11 carb 0
是否有一个purrr::map*
本机返回 long 的变体data.frame
?
解决方案
这不是map_df
函数的问题,而是bind_rows
. 变_dfr
体所做的就是调用map
then bind_rows
。从文档中?bind_rows
:
请注意,由于历史原因,包含向量的列表始终被视为数据框。因此,它们的向量被视为列 而不是行,并且它们的内部名称被忽略。您可以通过显式拼接来规避这种行为。
因为您的函数返回一个向量列表,所以bind_rows
会将每个向量视为列并返回一个宽数据框。除了您的方法之外gather
,您还有其他一些选择:
imap_dfr
通过使用来迭代列及其名称,使您的函数返回一个数据框。这是一个班轮,但可能更慢。
library(tidyverse)
mtcars %>%
imap_dfr(~tibble(name = .y, value = is.na(.x) %>% mean))
#> # A tibble: 11 x 2
#> name value
#> <chr> <dbl>
#> 1 mpg 0
#> 2 cyl 0
#> 3 disp 0
#> 4 hp 0
#> 5 drat 0
#> 6 wt 0
#> 7 qsec 0
#> 8 vs 0
#> 9 am 0
#> 10 gear 0
#> 11 carb 0
或者,返回一个命名向量而不是一个列表map_dbl
,然后用enframe
. 对于这个用例,这是我的基准测试中最快的。
mtcars %>%
map_dbl(~is.na(.) %>% sum) %>%
enframe()
#> # A tibble: 11 x 2
#> name value
#> <chr> <dbl>
#> 1 mpg 0
#> 2 cyl 0
#> 3 disp 0
#> 4 hp 0
#> 5 drat 0
#> 6 wt 0
#> 7 qsec 0
#> 8 vs 0
#> 9 am 0
#> 10 gear 0
#> 11 carb 0
由reprex 包(v0.3.0)于 2019 年 5 月 23 日创建
希望有帮助!
推荐阅读
- pyspark - 使用 countDistinct 倾斜数据
- django - 时区是 UTC 实际上是在 settings.py 文件中更改它
- angular - 使用 aot Angular 9 时出现的错误问题
- javascript - 为什么我得到 ESLint - 组件应该写成纯函数?
- php - 值作为空值插入数据库
- javascript - 为什么我的 d3.treemap() 返回的数据有很大的差距?
- python - 优化整数和字符串之间的求和
- python - 使用向量对 2D numpy 数组进行切片作为开始-停止索引
- java - Hot swapp vs Hot Code replace,有什么区别?
- r - 生成一个字符变量作为 ID 变量