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*
变体 native 返回一个长的 data.frame
?
最佳答案
这不是 map_df
函数的问题,而是 bind_rows
的问题。 _dfr
变体所做的只是调用 map
然后调用 bind_rows
。从文档 ?bind_rows
:
Note that for historical reasons, lists containing vectors are always treated as data frames. Thus their vectors are treated as columns rather than rows, and their inner names are ignored.You can circumvent that behaviour with explicit splicing.
因为您的函数返回向量列表,所以 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
使其成为一个 tibble。对于这个用例,这是我的基准测试中最快的。
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 package 创建于 2019-05-23| (v0.3.0)
希望有帮助!
关于r - purrr::map 返回长数据帧的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56281027/