使用 purrr 映射到 2 个函数

Use purrr to map to 2 functions

我有以下形式的数据

   date                  data              
   <chr>                <list>            
 1 2012-01-05           <tibble [796 x 5]>
 2 2012-01-12           <tibble [831 x 5]>
 3 2012-01-19           <tibble [820 x 5]>
 ...                       ...

我想使用类似于 map() 的方法来计算均值和标准差。

我目前可以单独使用以下,但可以同时计算。

mutate(stats = map(data, ~ sd(.$metric)))
mutate(stats = map(data, ~ mean(.$metric)))

另一种方法是制作一个类似于 summary 的函数,其中 returns 四分位数和平均值。但改为计算 meansd。然后我可以在 map 中使用这个新函数,如下所示:

mutate(stats = map(data, ~ new_function(.$metric)))

还有更好的选择吗?

添加多列的一个简单选项是只创建所需摘要统计信息的另一个列表列,然后unnest它:

library(tidyverse)
set.seed(47)

df <- data_frame(date = seq(as.Date('1970-01-01'), by = 1, length = 4), 
                 data = map(date, ~data_frame(metric = rnorm(10))))

df
#> # A tibble: 4 x 2
#>   date       data             
#>   <date>     <list>           
#> 1 1970-01-01 <tibble [10 × 1]>
#> 2 1970-01-02 <tibble [10 × 1]>
#> 3 1970-01-03 <tibble [10 × 1]>
#> 4 1970-01-04 <tibble [10 × 1]>

df %>% 
    mutate(stats = map(data, ~data.frame(mean = mean(.x$metric), 
                                         sd = sd(.x$metric)))) %>% 
    unnest(stats)
#> # A tibble: 4 x 4
#>   date       data                mean    sd
#>   <date>     <list>             <dbl> <dbl>
#> 1 1970-01-01 <tibble [10 × 1]> -0.106 0.992
#> 2 1970-01-02 <tibble [10 × 1]> -0.102 0.875
#> 3 1970-01-03 <tibble [10 × 1]> -0.833 0.979
#> 4 1970-01-04 <tibble [10 × 1]>  0.184 0.671

一种更具编程性的方法(可以更好地扩展)是在匿名函数内迭代函数列表。 lst 将自动命名它们,因此结果将被命名,并且 map_dfc 将它们绑定到一个数据框中:

df %>% 
    mutate(stats = map(data, 
                       ~map_dfc(lst(mean, sd), 
                                function(.fun) .fun(.x$metric)))) %>% 
    unnest(stats)

purrr 有一个专门用于迭代 functions/parameters 的函数,如下所示:invoke_map。如果要回收函数或参数,它们必须位于长度为 1 的列表中。由于参数应该已经收集在一个列表中,这里它必须是一个嵌套列表。

df %>% 
    mutate(stats = map(data, 
                       ~invoke_map_dfc(lst(mean, sd), 
                                       list(list(.x$metric))))) %>% 
    unnest(stats)

所有方法 return 相同。