我在使用循环制作列时遇到问题。
我有一个xts数据集,它是逐秒数据。
从
开始2014-09-01 00:00:00 104.172
2014-09-01 00:00:01 104.170
2014-09-01 00:00:02 104.170
2014-09-01 00:00:03 104.170
2014-09-01 00:00:04 104.170
2014-09-01 00:00:05 104.170
并以
结束2014-09-30 03:59:43 109.312
2014-09-30 03:59:44 109.312
2014-09-30 03:59:45 109.312
2014-09-30 03:59:46 109.312
2014-09-30 03:59:47 109.312
2014-09-30 03:59:48 109.313
我想从此数据集中创建第n天的列。 所以我做了类似的事情
for(i in 1:30){ask[i] <- ask[.indexmday(ask) == i]}
但它不起作用。相反,我收到了警告
number of items to replace is not a multiple of replacement length
当我这样做时
asksep1 <- ask[.indexmday(ask) == 1]
它有效,我可以获得9月1日的数据。所以我觉得我的循环有问题。
我该怎么做?谢谢你的帮助!
答案 0 :(得分:3)
好像你想要split.xts
。使用akrun's answer中的数据:
lst <- split(ask, "days")
sapply(lst, nrow)
# [1] 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400
#[13] 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400
#[25] 86400 86400 86400 86400 86400 14400
答案 1 :(得分:0)
您可以创建list
并将每天的子集存储在列表中。当每个day
的行数不相同时,它可能很有用。
days <- unique(.indexmday(ask))
lst <- vector('list', length(days))
for(i in seq_along(days))lst[[i]] <- ask[.indexmday(ask)==days[i]]
sapply(lst, nrow)
# [1] 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400
#[13] 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400 86400
#[25] 86400 86400 86400 86400 86400 14400
val <- rnorm(840000*3, 110)
indx <- seq(as.POSIXct('2014-09-01 00:00:00', format='%Y-%m-%d %H:%M:%S'),
length.out=840000*3, by='sec')
library(xts)
ask <- xts(val, order.by=indx)