如何解决根据日历年计算大数据表的日均值
我从服务器获得一个数据表,该数据表根据日历年的所选月份显示价格预测。基本上,数据是从一年中的每个月下载的。这是示例数据表:
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
并根据列名中的模式创建新列。一旦知道了,我们就可以为每个mean
取Date
。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。