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

时间:2018-06-18 09:47:27

标签: r list dataframe dplyr summarize

我有一个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)))

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

希望这很清楚,先谢谢。

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

2 个答案:

答案 0 :(得分: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,在我们group_by数据之前执行summarisesplit操作,以便我们最终得到一个列表。

答案 1 :(得分:1)

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