我有一个大型数据框(名为 z ),如下所示:
RPos M1
1 -0.00020
2 0.00010
3 -0.00012
4 -0.00035
5 -0.00038
...etc (about 300,000 observations)
它本质上是一个时间序列(虽然实际上是数据框,而不是ts
或zoo
)。
其中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,发布的,但我无法弄清楚如何使其适应限制列表。
非常感谢任何帮助!
答案 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