【问题标题】:R list of data.frames, mean summarise grouping by common factor variableR data.frames 列表,平均按公因子变量汇总分组
【发布时间】:2018-11-27 03:17:24
【问题描述】:

我有一个 data.frames 列表,每个包含 3 个变量:日期、值、键。

我想按关键因素对每个数据帧进行分组,并计算逐行平均值(即:按日期)。

这是一个玩具示例:

set.seed(123)

dates <- seq(from = as.Date("2018-06-18"), to = as.Date("2018-06-22"), length.out = 5)
fake_list <- list(d1 = data.frame(date = dates, value = rnorm(5), key = "aaa"),
              d2 = data.frame(date = dates, value = rnorm(5), key = "bbb"),
              d3 = data.frame(date = dates, value = rnorm(5), key = "aaa"),
              d4 = data.frame(date = dates, value = rnorm(5), key = "bbb"))

结果应该是这样的:

fake_result <- list(d_aaa = data.frame(date = dates, mean_value = c(0.3318031, 0.06481816, 0.9797399, 0.09059554, -0.2132767)),
                d_bbb = data.frame(date = dates, mean_value = c(1.750989, 0.4793833, -1.615839, 0.0072515, -0.4592267)))

基本上我需要按日期获取平均值,首先按关键因素聚合。

希望这足够清楚,在此先感谢。

此外,日期在列表中的长度可能不同(具有不同 nrows() 的数据帧),这给问题带来了另一个挑战..

【问题讨论】:

    标签: r list dataframe dplyr summarize


    【解决方案1】:

    你也可以从tidyr使用nest

    library(tidyverse)
    
    fake_result <- fake_list %>% 
      do.call(rbind, .) %>% 
      group_by(key, date) %>%
      summarise(mean_value = mean(value)) %>% 
      group_by(key) %>% 
      nest()
    
    fake_result
    
    # A tibble: 2 x 2
    #  key   data            
    #  <fct> <list>          
    #1 aaa   <tibble [5 x 2]>
    #2 bbb   <tibble [5 x 2]>
    
    
    fake_result$data
    
    #[[1]]
    # A tibble: 5 x 2
    #  date       mean_value
    #  <date>          <dbl>
    #1 2018-06-18     0.332 
    #2 2018-06-19     0.0648
    #3 2018-06-20     0.980 
    #4 2018-06-21     0.0906
    #5 2018-06-22    -0.213 
    
    #[[2]]
    ## A tibble: 5 x 2
    #  date       mean_value
    #  <date>          <dbl>
    #1 2018-06-18    1.75   
    #2 2018-06-19    0.479  
    #3 2018-06-20   -1.62   
    #4 2018-06-21    0.00725
    #5 2018-06-22   -0.459 
    

    【讨论】:

      【解决方案2】:

      这是一种选择

      library(tidyverse)
      fake_list %>% 
        bind_rows() %>% 
        group_by(key, date) %>% 
        summarise(value = mean(value)) %>%
        ungroup() %>% 
      # as.data.frame() %>%
        split(., .$key) %>% 
        map(., select, -key)
      #$aaa
      # A tibble: 5 x 2
      #  date         value
      #  <date>       <dbl>
      #1 2018-06-18  0.332 
      #2 2018-06-19  0.0648
      #3 2018-06-20  0.980 
      #4 2018-06-21  0.0906
      #5 2018-06-22 -0.213 
      #
      #$bbb
      # A tibble: 5 x 2
      #  date          value
      #  <date>        <dbl>
      #1 2018-06-18  1.75   
      #2 2018-06-19  0.479  
      #3 2018-06-20 -1.62   
      #4 2018-06-21  0.00725
      #5 2018-06-22 -0.459
      

      我们的想法是创建一个data.frame / tibble,在我们split 数据之前执行group_bysummarise 操作,以便我们最终得到一个列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2014-03-07
        • 2021-09-27
        相关资源
        最近更新 更多