这个问题附在前面提到的一个问题上,即将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
中运行它。
过去两天我一直坚持这个问题,所以非常感谢任何帮助。
答案 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
,那么您可以交换var
和month
循环吗?
答案 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))
}