【发布时间】:2015-11-01 12:10:01
【问题描述】:
获得我需要的结构以完成我想要的工作所涉及的过程很长,所以请耐心等待。
我创建了一个大的每日元素列表,这些元素被分成不同的星期:
jobs <- sample(1:100, size = 4018, replace = TRUE)
unemployed <- sample(1:100, size = 4018, replace = TRUE)
insurance <- sample(1:100, size = 4018, replace = TRUE)
daily_seq <- seq(as.Date("2004-01-01"), as.Date("2014-12-31"), by = "days")
daily_df <- data.frame(daily_seq, jobs, unemployed, insurance)
library(xts)
daily_xts <- xts(daily_df[-1], order.by = as.Date(daily_seq))
# split daily series into list of daily series split by calendar months:
split_list1 <- split(daily_xts, f = "months", drop = FALSE, k = 1)
# split further into large list of weekly elements with daily data define by week number 1:4:
splitlist1 = NULL
for (i in 1:length(split_list1)) {
intervals <- cut(.indexmday(split_list1[[1]]), c(0, 7, 14, 21, 31), 1:4)
splitlist1[[i]] <- split(split_list1[[i]], intervals)
splitlist1
}
splitlist1 是平衡日历周元素的大型列表。
我实际上想要做的是循环每个“周”并计算每日系列的每周平均值。
我为所需的输出矩阵对象创建了一个日期序列,以对应于我想要的周数:
# date sequence corresponding to weekly averaged dates needed. "v2" is the sequence:
library(lubridate)
v1 <- seq(as.Date("2004-01-01"), as.Date("201-12-31"), by = "week")
lst <- split(v1, list(month(v1), year(v1)), drop=TRUE) # split vector into months and years
days <- substr(v1[1:4],9,10) # substring extracts first 4 observations from a month as the basis of the sequence
v2 <- unlist(lapply(lst, function(y) {
sprintf('%s%s', substr(y[1:4], 1,8), days)}), use.names=FALSE)
# create matrix for desired output:
week_matrix = matrix(NA, nrow = length(v2), ncol = ncol(split_list1[[1]]), dimnames = dimnames(split_list1[[1]][1]))
然后我继续用这些代码行计算相应的平均值:
# loop through each weekly element "j" of daily data and calculate weekly average:
for (i in 1:length(splitlist1)) {
for (j in 1:4) {
for (n in 1:ncol(splitlist1[[1]]$`1`)){
week_matrix[i,n] <- weighted.mean(splitlist1[[i]]$'j'[,n])
week_matrix
}}}
但是,它返回与代码行 Error in 1:ncol(splitlist1[[1]]$j) : argument of length 0 相关的错误,即使在特定周运行此行 j 返回一个整数。
另外,如果我删除这行代码,它会显示一个没有计算的空矩阵。
我已经尝试了我能想到的所有可能的代码行变体,但是我无法产生我想要的输出。我想要的输出是一个矩阵/xts 类型对象,其每周平均值沿对应于v2 日期序列的行和对应于jobs; unemployed; and insurance 的列
你们能帮我解决这个问题吗?!提前致谢。
【问题讨论】:
-
您的原始时间序列和每周时间序列的长度不同。这可能会导致您的问题。但是,下面的答案使用的代码要少得多,所以请尝试一下!
-
@MikeRSpencer - 对不起,我的错。已修复,但同样的问题。会试一试的。
-
当你问一个问题时,试着只问一件事。目前这是一个关于列表和手段的问题,但有很多时间序列生成问题。这些应该是单独的问题,而不是“这是我的代码 - 修复它”。