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_by
和 summarise
操作,这样我们就结束了列出一份清单。
您也可以使用 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
我有一个 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_by
和 summarise
操作,这样我们就结束了列出一份清单。
您也可以使用 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