R:如何加快这个功能?

时间:2012-02-15 21:07:18

标签: r dataframe time-series

我有一个大型数据框(名为 z ),如下所示:

    RPos    M1
    1   -0.00020
    2   0.00010
    3   -0.00012
    4   -0.00035
    5   -0.00038 
...etc (about 300,000 observations)

它本质上是一个时间序列(虽然实际上是数据框,而不是tszoo)。 其中RPos是索引号(显式存储),M1是任何度量。

我有另一个数据框(名为 actionlist ),有大约30,000 *次非连续观察。 actionlist的RPos列中的每个值代表34个连续点中的最后一个。

我的最后一段数据是仅有34次连续观察的单一数据框(名为 x )。

我的目标是计算 x 与动作列表中每个观察值之间的相关系数(这也是34次连续观察的终点)。

为此,我必须从 z (大数据帧)生成这些34点连续点时间序列段。

目前,我这样做:

n1<-33:0
for(i in 1:nrow(actionlist))
{
    crs[i,2]<-cor(z[actionlist$RPos[i]+n1,2],x[,2])  
}

在查看Rprof读数时,这就是我得到的:

$by.self
              self.time self.pct total.time total.pct
[.data.frame       0.68    25.37       0.98     36.57
.Call              0.22     8.21       0.22      8.21
cor                0.16     5.97       2.30     85.82
...etc

看起来[.data.frame花费的时间最长。 具体来说,我很确定这是这一部分: z[actionlist$RPos[i]+n1,2]

如何加速(不需要?)这部分功能?

之前我问了一个类似的问题,除了在限制列表中查找(actionlist),我正在查看 z 中每个可能的连续34次观察。答案是here,发布的,但我无法弄清楚如何使其适应限制列表。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

最直接的可能是构建 包含所需数据的矩阵 计算相关性,并完全避开循环。

# Sample data
n <- 3e5
m <- 3e4
k <- 35
z <- data.frame(
  RPos = 1:n,
  M1   = rnorm(n)
)
actionlist <- sample( k:n, m )
x <- rnorm(k)

system.time( for (j in 1:10) {
  # Index of the observations we want
  i <- sapply( (k-1):0, function(u) actionlist - u )
  # Data we want to compute the correlation with
  y <- matrix( z$M1[i], nr=nrow(i) )
  # Computations
  result <- cor(t(y),x)
} ) # 150ms per iteration