r - purrr::map 返回长数据帧的变体

标签 r tidyr purrr

purrr::map_dfrpurrr::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/

相关文章:

r - 使用map和fcase更新嵌套列表的元素

r - 绘图中的标签线

r - 从数据框创建混淆矩阵

r - tidyr:在函数内使用 mutate

r - 基于两个变量的dplyr过滤

r - tidyr::crossing 可以在函数中与 curly-curly 一起使用吗?

r - 映射列表,获取项目名称和内容

r - 如何用点的颜色填充geom_point图例中的框,而不仅仅是增加它们的大小?

R 在数据框列中列出因素

r - 错误: missing values and NaN's not allowed if 'na.rm' is FALSE