【问题标题】:How to get the sum of each four rows of a matrix in R如何获得R中矩阵的每四行的总和
【发布时间】:2011-10-15 23:54:03
【问题描述】:

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

【问题讨论】:

  • 矩阵有没有代表时间索引的列?
  • 目前的问题并不是很容易理解:你的标题和你的第一句话提供了不同的信息。请添加其他信息并给我们一些可重现的示例,如in this question 所述
  • @Joris 对此我深表歉意。我已经更新了我的问题。

标签: r time-series summary


【解决方案1】:
colSums(matrix(test.data$observation, nrow=4))

【讨论】:

  • 您好,我有一个 7700 x 94 的数据框,带有列名和行名。我想要一个 1100 x 94 的数据框,其中 1100 个新数字是原始 7700 的 7 天平均值。
【解决方案2】:

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

我假设您的数据是一个矩阵,每 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)

【讨论】:

  • 感谢您的有用回答,对于我的含糊之处,我深表歉意。我已经用一个例子更新了我的答案,包括时间列。
【解决方案3】:
sapply(split(test.data$observation, rep(1:(192/4), each=4)), sum)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多