我有一个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()的数据框),这给问题带来了另一个挑战..
答案 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
数据之前执行summarise
和split
操作,以便我们最终得到一个列表。
答案 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