data.frames 的 R 列表,均值按公共因子变量汇总分组

R list of data.frames, mean summarise grouping by common factor variable

我有一个 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() 的数据框),这给问题带来了另一个挑战..

这是一个选项

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 操作,这样我们就结束了列出一份清单。

您也可以使用 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