代码之家  ›  专栏  ›  技术社区  ›  RLave

r数据框列表,按公共因子变量进行平均汇总分组

  •  1
  • RLave  · 技术社区  · 6 年前

    我有一个data.frames列表,每个列表有3个变量:date、value和key。

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

    下面是一个玩具示例:

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

    基本上,我需要得到按日期的平均值,首先按关键因素汇总。

    希望这足够清楚,提前谢谢。

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   markus    6 年前

    这里有一个选择

    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 group_by summarise 我们之前的行动 split 我们最终得到一个列表的数据。

        2
  •  1
  •   patL grad student    6 年前

    你可以使用 nest 太离 tidyr :

    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