簡體   English   中英

根據日歷年計算大數據表的每日平均值

[英]calculate daily mean of big data table depending on calendar year

我從服務器獲取了一個數據表,該表根據日歷年的選定月份顯示價格預測。 基本上,數據是從一年中的每個月下載的。 下面是一個示例數據表:

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)

這個數據表很小,因為我只創建了 2021 年和 2022 年的數據。但是可以有幾個日歷年,或者只有一個日歷年。

現在我想計算 2021 年的每日平均值(基於日期列)(即每天/日期所有 12 個值的總和除以 12 = 每個日歷年的月數)並將它們保存在新數據中表作為一列。 現在當然 2022 年也是如此。

在這種情況下,新數據表應具有以下列:

| 日期 | BRN Cal-2021 | BRN Cal-2022 |

其中日期列保持不變。

新數據表的計算和列指定應始終是可變的(取決於dt.data出現的日歷年dt.data )。 基本上,在開始時dt.data歷年組織dt.data可能是有意義的。 但實際上我真的不知道如何保持平均計算(每日)可變和一般? 或者您應該為每個日歷年創建一個額外的數據表,然后計算平均值,然后將列與每日平均值合並回一個公共數據表? 但是,這應該始終保持自動化(取決於有多少個日歷年)。 不幸的是,我不知道如何做到這一點。

我希望我能夠足夠准確地提出我的問題,並且有人可以幫助我解決我的問題。

是的,最好在不同的列中獲取每年的數據。 我們可以pivot_longer使用pivot_longer並根據列名中的模式創建新列。 一旦我們得到了,我們就可以對每個Datemean

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM