首页 文章

使用purrr映射到2个函数

提问于
浏览
2

我有以下表格的数据

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 回答

  • 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)
    

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

相关问题