【问题标题】:purrr::map variant which returns long data.framepurrr::map 变体返回长 data.frame
【发布时间】:2019-10-10 08:54:06
【问题描述】:

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* 变体本机返回一个长 data.frame

【问题讨论】:

  • 在数据框上调用map_* 意味着您正在映射列列表,因此生成的数据框将具有与原始数据框相同的列数是有意义的。你只是想要summarize_all吗?
  • tidyverse 函数旨在做一件事并把它做好。现在“一件事”的意思是一个灰色区域,但我看到你想要做的事情的方式真的是summarize_all + gather

标签: r tidyr purrr


【解决方案1】:

这不是map_df 函数的问题,而是bind_rows 的问题。所有_dfr 变体都是调用map 然后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 package (v0.3.0) 于 2019 年 5 月 23 日创建

希望有帮助!

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多