使用purrr映射到2个函数

时间:2018-04-12 17:55:37

标签: r dplyr tidyverse purrr

我有以下表格的数据

   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的函数,它返回四分位数和均值。但请改为计算meansd。那么我可以在map中使用这个新函数,如下所示:

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

有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

添加多个列的一个简单选项是,只需创建所需摘要统计信息的另一个列表列,然后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有一个专门用于迭代函数/参数的函数,如:invoke_map。如果您希望回收函数或参数,则它们必须位于长度为1的列表中。由于参数应该已经在列表中收集,因此它必须是嵌套列表。

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

所有方法都返回相同的东西。