如何得到R中矩阵的每四行的总和

时间:2011-07-29 13:52:29

标签: r time-series summary

我有一个4n乘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位)

3 个答案:

答案 0 :(得分:17)

colSums(matrix(test.data$observation, nrow=4))

答案 1 :(得分:7)

我会做出一系列疯狂的假设,因为你的问题很模糊。

我假设您的数据是一个每7.5分钟观察一次的矩阵,并且没有空间索引。因此,100行可能如下所示:

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

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

有很多方法可以做到这一点,但第一个跳到我脑海中的是创建索引,然后执行“group by”和sum的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)

答案 2 :(得分:2)

sapply(split(test.data$observation, rep(1:(192/4), each=4)), sum)