将具有多列的列表的元素拆分为 R 中不规则的每周间隔

Split elements of a list with multiple columns into irregular weekly intervals in R

此问题附加到之前提出的关于将 xts 对象拆分为不规则的每周间隔的问题, - 但是添加了一个包含多列 xts 对象的列表。

我设法将每日系列拆分为每月元素(包含每日数据),而不是一个每日 xts 对象,因此在 2 年的时间里,我将有一个包含每日数据的 24 个 xts 元素的列表.

示例:

week <- seq(from=as.Date("2004-01-01"), to=as.Date("2005-12-31"), by = "day")
x2 <- sample(1:1000, 731, replace = FALSE)
x3 <- sample(1:1000, 731, replace = FALSE)
x4 <- sample(1:1000, 731, replace = FALSE)
var1 <- xts(x2, order.by = week)
var2 <- xts(x3, order.by = week)
var3 <- xts(x4, order.by = week)
daily.series <- merge.xts(var1, var2, var3)
split_monthly <- split(daily.series, f = "months", k = 1)

我想做的是将 split_monthly 列表中的元素分成不规则的间隔,就像上面 link 中所做的那样。

最初这有效:

for (i in seq_along(split_monthly)){
intervals <- cut(.indexmday(split_monthly[[i]]$var1), c(0, 7, 14, 21, 31), paste0("W", 1:4))
splitlist[[i]] <- split(split_monthly[[i]], intervals)
splitlist}

但我想 运行 它通过每一列,即 var1, var2, var3for 循环 中(我更喜欢)。

在过去的 2 天里,我一直被这个问题所困,所以非常感谢任何帮助。

这符合您的要求吗?我仍然不确定您的确切要求:

week <- seq(from=as.Date("2004-01-01"), to=as.Date("2005-12-31"), by = "day")
x2 <- sample(1:1000, 731, replace = FALSE)
x3 <- sample(1:1000, 731, replace = FALSE)
x4 <- sample(1:1000, 731, replace = FALSE)
var1 <- xts(x2, order.by = week)
var2 <- xts(x3, order.by = week)
var3 <- xts(x4, order.by = week)

for(v in 1:3){
    daily.series <- get(paste0('var',v))
    intervals_day <- cut(.indexmday(daily.series), c(0, 7, 14, 21, 31), paste0("W", 1:4))
    intervals_month <- cut(.indexmon(daily.series),12, paste0("M", 1:12))
    intervals_year <- cut(.indexyear(daily.series),2, paste0("Y", 1:2))
    intervals <- as.factor(paste(intervals_year,intervals_month,intervals_day))
    assign(paste0('split_monthly_var',v),split(daily.series, intervals))
}

编辑:在上方添加 intervals_year

只是检查一下,这个似乎没问题:

split_monthly_var1[[1]]

这个不行,.indexmon()好像搞砸了,但如果我在正确的轨道上,那是可以解决的。

split_monthly_var1[[48]]

编辑: 要规避 .indexmon() 问题,您可以将日期提取为字符并拆分字符串以仅提取月份:

for(v in 1:3){
    daily.series <- get(paste0('var',v))
    intervals_day <- cut(.indexmday(daily.series), c(0, 7, 14, 21, 31), paste0("W", 1:4))
    dates_list <- strsplit(as.character(as.Date(.indexDate(daily.series))),"-")
    intervals_month <- paste0('M',lapply(dates_list,'[',2))
    intervals_year <- cut(.indexyear(daily.series),2, paste0("Y", 1:2))
    intervals <- as.factor(paste(intervals_year,intervals_month,intervals_day))
    assign(paste0('split_monthly_var',v),split(daily.series, intervals))
}

我不完全确定你想要的输出是什么,但你可以简单地做(例如)

lapply(splitlist[[1]], '[', j='var1')

这将为您提供第一个月的 var1 值,按周划分,依此类推?

$W1
2004-01-01 2004-01-02 2004-01-03 2004-01-04 2004-01-05 2004-01-06 2004-01-07 
       281        518        630        301        194        480        952 

$W2
2004-01-08 2004-01-09 2004-01-10 2004-01-11 2004-01-12 2004-01-13 2004-01-14 
       335        371        668        138        680        631         68 

$W3
2004-01-15 2004-01-16 2004-01-17 2004-01-18 2004-01-19 2004-01-20 2004-01-21 
       975        424        142        212         35        718        534 

$W4
2004-01-22 2004-01-23 2004-01-24 2004-01-25 2004-01-26 2004-01-27 2004-01-28 2004-01-29 2004-01-30 2004-01-31 
       359        805        320        628        219        373        641        812        617        606 

或者,如果您需要显式 for 循环,您可以只对变量进行循环:

for (i in seq_along(split_monthly)){
    intervals <- cut(.indexmday(split_monthly[[i]]$var1), c(0, 7, 14, 21, 31), paste0("W", 1:4))

    for (var in names(split_monthly[[i]])) {
        split(split_monthly[[i]][, var], intervals)
        # do some processing here
    }
}

同样,不完全清楚你在追求什么。如果您的处理需要在 var 之前发生在 month?

之前,您可以交换 vari 循环