10

我有一个 4n x m 矩阵(一年中每隔 7.5 分钟求和)。我想将这些转换为 30 分钟的总和,例如将 70080 x 1 转换为 17520 矩阵。

执行此操作的计算效率最高的方法是什么?

更多细节:这里是一个例子(缩短为一天而不是一年)

library(lubridate)
start.date <- ymd_hms("2009-01-01 00:00:00")
n.seconds    <- 192 # one day in seconds
time <- start.date + c(seq(n.seconds) - 1) * seconds(450)

test.data <- data.frame(time = time, 
                        observation = sin(1:n.seconds / n.seconds * pi))

R版本:2.13;平台:x86_64-pc-linux-gnu(64位)

4

3 回答 3

18
colSums(matrix(test.data$observation, nrow=4))
于 2011-07-29T16:56:20.503 回答
7

由于您的问题相当模棱两可,我将做出一系列疯狂的假设。

我假设您的数据是一个矩阵,每 7.5 分钟进行一次观察,并且没有空间索引。所以 100 行可能看起来像这样:

data <- matrix(rnorm(400), ncol=4)

并且您想要汇总 4 行的块。

有很多方法可以做到这一点,但第一个跳入我脑海的是创建一个索引,然后执行 R 版本的“分组依据”并求和。

一个示例索引可能是这样的:

index <- rep(1:25, 4)
index <- index[order(index)]

所以现在我们有了一个与数据长度相同的索引,你可以用它aggregate()来总结一下:

aggregate(x=data, by = list(index), FUN=sum)

编辑:

上述方法的精神可能仍然有效。但是,如果您对时间序列数据做了很多工作,您可能应该了解 xts 包。这是一个 xts 示例:

require(xts)
test.xts <- xts(test.data$observation, order.by=test.data$time)
period.apply(test.xts, endpoints(test.xts,"minutes", 30), sum)
于 2011-07-29T14:26:50.233 回答
3
sapply(split(test.data$observation, rep(1:(192/4), each=4)), sum)
于 2011-07-29T20:54:35.850 回答