在R

时间:2015-07-22 04:50:06

标签: r date split xts

这个问题附在前面提到的一个问题上,即将xts对象分成不规则的每周间隔,Split xts object by specified irregular intervals in R - 但是添加了一个包含多个列的xts对象的列表。

我没有设置每日xts对象,而是设法将每日系列分成每月元素(包含每日数据),因此在2年的时间内,我会有一个包含每日数据的24 xts元素的列表。 / p>

示例:

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列表中的元素拆分为不规则的间隔,就像在上面的链接中所做的那样。

最初这有效:

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}

但是我想在 for循环(这是我更喜欢的)中的每一列var1, var2, var3中运行它。

过去两天我一直坚持这个问题,所以非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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之前i,那么您可以交换varmonth循环吗?

答案 1 :(得分:0)

这是否符合您的要求?我还不确定你要求的确切内容:

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))
}

编辑:在

之上添加了interval_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))
}