根据日历年计算大数据的每日平均值 table
calculate daily mean of big data table depending on calendar year
我从服务器获取数据 table,该数据根据日历年的选定月份显示价格预测。基本上,数据是从一年中的每个月下载的。这是一个示例数据 table:
set.seed(123)
dt.data <- data.table(Date = seq(as.Date('2020-01-01'), by = '1 day', length.out = 365),
'BRN Jan-2021' = rnorm(365, 2, 1), 'BRN Jan-2022' = rnorm(365, 2, 1),
'BRN Feb-2021' = rnorm(365, 2, 1), 'BRN Feb-2022' = rnorm(365, 2, 1),
'BRN Mar-2021' = rnorm(365, 2, 1), 'BRN Mar-2022' = rnorm(365, 2, 1),
'BRN Apr-2021' = rnorm(365, 2, 1), 'BRN Apr-2022' = rnorm(365, 2, 1),
'BRN May-2021' = rnorm(365, 2, 1), 'BRN May-2022' = rnorm(365, 2, 1),
'BRN Jun-2021' = rnorm(365, 2, 1), 'BRN Jun-2022' = rnorm(365, 2, 1),
'BRN Jul-2021' = rnorm(365, 2, 1), 'BRN Jul-2022' = rnorm(365, 2, 1),
'BRN Aug-2021' = rnorm(365, 2, 1), 'BRN Aug-2022' = rnorm(365, 2, 1),
'BRN Sep-2021' = rnorm(365, 2, 1), 'BRN Sep-2022' = rnorm(365, 2, 1),
'BRN Oct-2021' = rnorm(365, 2, 1), 'BRN Oct-2022' = rnorm(365, 2, 1),
'BRN Nov-2021' = rnorm(365, 2, 1), 'BRN Nov-2022' = rnorm(365, 2, 1),
'BRN Dec-2021' = rnorm(365, 2, 1), 'BRN Dec-2022' = rnorm(365, 2, 1),
check.names = FALSE)
这个数据table很小,因为我只创建了 2021 年和 2022 年的数据。但是可以有多个日历年,也可以只有一个日历年。
现在我想计算 2021 年的每日平均值(基于日期列)(即每天/日期所有 12 个值的总和除以 12 = 每个日历年的月数)并保存它们在新数据 table 中作为一列。现在 2022 年当然也一样。
在这种情况下,新数据 table 应具有以下列:
|日期 | BRN Cal-2021 | BRN Cal-2022 |
其中日期栏保持不变。
新数据 table 的计算和列名称应始终可变(取决于 dt.data
中出现的日历年数)。基本上,开始时按日历年组织 dt.data
可能是有意义的。但实际上我真的不知道如何保持平均计算(每日)可变和通用?或者,也许您应该为每个日历年创建一个额外的数据 table,然后计算平均值,然后将具有每日平均值的列合并回一个公共数据 table?但是,这应该始终保持自动化(取决于有多少个日历年)。不幸的是,我不知道该怎么做。
我希望我能够足够准确地提出我的问题,并且有人可以帮助我解决我的问题。
是的,最好将每年的数据放在单独的列中。我们可以为此使用 pivot_longer
并根据列名中的模式创建新列。一旦我们得到它,我们就可以为每个 Date
.
取 mean
library(dplyr)
dt.data %>%
tidyr::pivot_longer(cols = -Date,
names_to = c('month', '.value'),
names_pattern = c('(.*)-(\d+)')) %>%
group_by(Date) %>%
summarise(across(c(matches('^\d+$')), mean, na.rm =TRUE))
不获取长格式数据的基本 R 选项将使用 split.default
。我们根据列名中提到的年份拆分数据,并在每个列表中取行方向平均值。
result <- cbind(dt.data[, 1], sapply(split.default(dt.data[, -1],
sub('.*-', '', names(dt.data)[-1])), rowMeans, na.rm = TRUE))
names(result)[-1] <- paste0('BRN_Cal-', names(result)[-1])
# Date BRN_Cal-2021 BRN_Cal-2022
# 1: 2020-01-01 1.974847 2.272833
# 2: 2020-01-02 2.241470 2.399902
# 3: 2020-01-03 1.988883 2.372697
# 4: 2020-01-04 2.057867 2.084504
# 5: 2020-01-05 2.012305 2.049808
# ---
#361: 2020-12-26 2.038167 2.161655
#362: 2020-12-27 2.308974 2.215492
#363: 2020-12-28 2.001359 2.552923
#364: 2020-12-29 2.086283 1.773254
#365: 2020-12-30 1.802871 2.107373
我从服务器获取数据 table,该数据根据日历年的选定月份显示价格预测。基本上,数据是从一年中的每个月下载的。这是一个示例数据 table:
set.seed(123)
dt.data <- data.table(Date = seq(as.Date('2020-01-01'), by = '1 day', length.out = 365),
'BRN Jan-2021' = rnorm(365, 2, 1), 'BRN Jan-2022' = rnorm(365, 2, 1),
'BRN Feb-2021' = rnorm(365, 2, 1), 'BRN Feb-2022' = rnorm(365, 2, 1),
'BRN Mar-2021' = rnorm(365, 2, 1), 'BRN Mar-2022' = rnorm(365, 2, 1),
'BRN Apr-2021' = rnorm(365, 2, 1), 'BRN Apr-2022' = rnorm(365, 2, 1),
'BRN May-2021' = rnorm(365, 2, 1), 'BRN May-2022' = rnorm(365, 2, 1),
'BRN Jun-2021' = rnorm(365, 2, 1), 'BRN Jun-2022' = rnorm(365, 2, 1),
'BRN Jul-2021' = rnorm(365, 2, 1), 'BRN Jul-2022' = rnorm(365, 2, 1),
'BRN Aug-2021' = rnorm(365, 2, 1), 'BRN Aug-2022' = rnorm(365, 2, 1),
'BRN Sep-2021' = rnorm(365, 2, 1), 'BRN Sep-2022' = rnorm(365, 2, 1),
'BRN Oct-2021' = rnorm(365, 2, 1), 'BRN Oct-2022' = rnorm(365, 2, 1),
'BRN Nov-2021' = rnorm(365, 2, 1), 'BRN Nov-2022' = rnorm(365, 2, 1),
'BRN Dec-2021' = rnorm(365, 2, 1), 'BRN Dec-2022' = rnorm(365, 2, 1),
check.names = FALSE)
这个数据table很小,因为我只创建了 2021 年和 2022 年的数据。但是可以有多个日历年,也可以只有一个日历年。
现在我想计算 2021 年的每日平均值(基于日期列)(即每天/日期所有 12 个值的总和除以 12 = 每个日历年的月数)并保存它们在新数据 table 中作为一列。现在 2022 年当然也一样。
在这种情况下,新数据 table 应具有以下列:
|日期 | BRN Cal-2021 | BRN Cal-2022 |
其中日期栏保持不变。
新数据 table 的计算和列名称应始终可变(取决于 dt.data
中出现的日历年数)。基本上,开始时按日历年组织 dt.data
可能是有意义的。但实际上我真的不知道如何保持平均计算(每日)可变和通用?或者,也许您应该为每个日历年创建一个额外的数据 table,然后计算平均值,然后将具有每日平均值的列合并回一个公共数据 table?但是,这应该始终保持自动化(取决于有多少个日历年)。不幸的是,我不知道该怎么做。
我希望我能够足够准确地提出我的问题,并且有人可以帮助我解决我的问题。
是的,最好将每年的数据放在单独的列中。我们可以为此使用 pivot_longer
并根据列名中的模式创建新列。一旦我们得到它,我们就可以为每个 Date
.
mean
library(dplyr)
dt.data %>%
tidyr::pivot_longer(cols = -Date,
names_to = c('month', '.value'),
names_pattern = c('(.*)-(\d+)')) %>%
group_by(Date) %>%
summarise(across(c(matches('^\d+$')), mean, na.rm =TRUE))
不获取长格式数据的基本 R 选项将使用 split.default
。我们根据列名中提到的年份拆分数据,并在每个列表中取行方向平均值。
result <- cbind(dt.data[, 1], sapply(split.default(dt.data[, -1],
sub('.*-', '', names(dt.data)[-1])), rowMeans, na.rm = TRUE))
names(result)[-1] <- paste0('BRN_Cal-', names(result)[-1])
# Date BRN_Cal-2021 BRN_Cal-2022
# 1: 2020-01-01 1.974847 2.272833
# 2: 2020-01-02 2.241470 2.399902
# 3: 2020-01-03 1.988883 2.372697
# 4: 2020-01-04 2.057867 2.084504
# 5: 2020-01-05 2.012305 2.049808
# ---
#361: 2020-12-26 2.038167 2.161655
#362: 2020-12-27 2.308974 2.215492
#363: 2020-12-28 2.001359 2.552923
#364: 2020-12-29 2.086283 1.773254
#365: 2020-12-30 1.802871 2.107373