根据日历年计算大数据表的日均值

问题描述

我从服务器获得一个数据表,该数据表根据日历年的所选月份显示价格预测。基本上,数据是从一年中的每个月下载的。这是示例数据表:

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,'BRN Feb-2021' = rnorm(365,'BRN Feb-2022' = rnorm(365,'BRN Mar-2021' = rnorm(365,'BRN Mar-2022' = rnorm(365,'BRN Apr-2021' = rnorm(365,'BRN Apr-2022' = rnorm(365,'BRN May-2021' = rnorm(365,'BRN May-2022' = rnorm(365,'BRN Jun-2021' = rnorm(365,'BRN Jun-2022' = rnorm(365,'BRN Jul-2021' = rnorm(365,'BRN Jul-2022' = rnorm(365,'BRN Aug-2021' = rnorm(365,'BRN Aug-2022' = rnorm(365,'BRN Sep-2021' = rnorm(365,'BRN Sep-2022' = rnorm(365,'BRN Oct-2021' = rnorm(365,'BRN Oct-2022' = rnorm(365,'BRN Nov-2021' = rnorm(365,'BRN Nov-2022' = rnorm(365,'BRN Dec-2021' = rnorm(365,'BRN Dec-2022' = rnorm(365,check.names = FALSE)

该数据表非常小,因为我只创建了2021年和2022年的数据。但是可以有多个日历年,也可以只有一个日历年。

现在,我想计算2021年的每日平均值(基于日期列)(即,每天/日期所有12个值的总和除以12 =每个日历年的月份数)并将其保存在一个新的数据表作为一列。现在当然也要到2022年。

在这种情况下,新的数据表应具有以下列:

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

日期列保持不变。

新数据表的计算和列名称应始终可变(取决于dt.data中出现的日历年数)。基本上,在开始时按日历年组织dt.data可能是有意义的。但是实际上我真的不知道如何保持平均计算(每日)变量和常规值?或者,也许您应该为每个日历年度创建一个额外的数据表,然后计算平均值,然后将这些列与每日平均值合并回到一个公用数据表中?但是,这应始终保持自动化(取决于有多少个日历年)。不幸的是,我不知道该怎么办。

我希望我能够足够准确地提出我的问题,并且有人可以帮助我解决我的问题。

解决方法

是的,每年最好在单独的列中获取数据。我们可以为此使用pivot_longer并根据列名中的模式创建新列。一旦知道了,我们就可以为每个meanDate

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...