根据日历年计算大数据的每日平均值 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