在r中提取月度数据的第n天

时间:2014-12-21 06:37:47

标签: r loops xts

我在使用循环制作列时遇到问题。

我有一个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日的数据。所以我觉得我的循环有问题。

我该怎么做?谢谢你的帮助!

2 个答案:

答案 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)