我正在使用R来使用zoo和chron进行一些时间序列分析。我有一个包含大量数据的动物园对象,并且需要能够使用window
函数将数据子集化为仅一天的值,然后是接下来的几天,然后是下一个等等。 / p>
我试图找到最简单的方法来创建一个数组,其中包含某一时期内每天的日期,并提出以下内容:
orig = c(month=1, day=1, year=2005)
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m"))
这使用朱利安日符号,从我的约会期的第一天开始,有1825天(365 * 5 - 五年)。然后我尝试使用此数组的每个元素执行for循环:
for (date in dates)
{
s = chron(date, "00:00:00", origin=orig)
e = chron(date, "23:59:59", origin=orig)
aeronet_day = window(aeronet, start=s, end=e)
}
但是,这给了我一个警告,说明我使用aeronet
动物园对象以及s
和e
变量的不同来源,并且它不会选择任何数据
有更好的方法吗?或者解决这个问题的方法?基本上我想要的是运行一个for循环,在循环中我可以使用aeronet_day = window(aeronet, start=s, end=e)
代码生成一个包含一天数据的zoo对象(例如2005年5月1日00:00:00到23: 59:59。
答案 0 :(得分:4)
假设我们有这些数据:
# create test data
library(zoo)
library(chron)
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2)
1)汇总
R aggregate
函数有一个zoo方法。第二个论点是我们聚合的。如果它是一个函数,它将应用于zoo对象的索引。例如在这里我们计算每个日期的平均值:
z.ag <- aggregate(z, as.Date, mean)
如果我们愿意,我们可以用更复杂的函数替换mean
。
2)拆分。 R split
函数有一个zoo方法。如果我们确实想要按日期分割z
那么我们就可以做到这一点。这里z.split.list
是一个列表,其中每个组件都包含一个日期的zoo对象。
z.split.list <- split(z, as.Date(time(z)))
现在(a)sapply
或(b)lapply
超过该列表或(c)使用以下内容(将print(zc)
替换为所需的任何处理)。这里zc
是列表的一个组成部分,即它是仅通过特定日期形成的动物园对象:
for(zc in z.split.list) print(zc)
请注意,as.Date(time(z))
是一个向量,其日期对应于z的元素。
编辑:
各种细微的阐述。
答案 1 :(得分:0)
我不熟悉动物园,但我通常只是将日期转换为数字,然后制作序列,然后再转换回来。例如:
> as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01')
[1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13"
[9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21"
[17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29"
[25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06"
[33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14"
[41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22"
...
答案 2 :(得分:0)
如果你想在每个日期做某事,那么你所拥有的就好了。
一些示例aeronet
数据。
last_date <- 1825
n <- 10000
aeronet <- data.frame(
some.value = seq_len(n),
date = as.chron(
runif(n, 0, last_date),
origin = orig,
out.format = c(dates = "d/m/y", times = "h:m")
)
)
现在,您可以使用split
按日期拆分数据,或者使用tapply
中的ddply
或plyr
将一个函数应用于每个日期(或使用aggregate
或者其他什么)。
with(aeronet, split(some.value, date))
with(aeronet, tapply(some.value, date, sum))
library(plyr)
ddply(aeronet, .(date), summarise, sum(some.value))