【问题标题】:R: How to speed up this function?R:如何加速这个功能?
【发布时间】:2012-02-15 21:07:18
【问题描述】:

我有一个大数据框(名为 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 个连续点中的最后一个。

我的最后一条数据是单个数据框(名为 x),仅包含 34 个连续观察。

我的目标是计算 x 与 actionlist 中每个观察值之间的相关系数(同样,它是 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,,但我不知道如何使其适应受限列表。

任何帮助将不胜感激!

【问题讨论】:

  • 贴一些可复现的代码和测试数据会更容易帮助到你。
  • 此外,如果您在此使用与上一个答案相同的术语,会更容易(尤其是对我而言!)。有什么理由需要zx 成为data.frames?重复子集不需要的东西是非常浪费的,例如,您可以轻松地将 x[,2] 置于循环之外,只需在外部执行一次 x2 &lt;- x[,2],然后在循环中将该向量称为 @987654335 @。同样,如果Rpos 本身只是从1:nrow(z) 运行,则根本不需要使用$Rpos[i] 进行索引...
  • 是的,你绝对是对的,以后我会使用一致的术语。我会记住子集的事情。

标签: r dataframe time-series


【解决方案1】:

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

# 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

【讨论】:

  • 太棒了!这让事情加速了很多。非常感谢!
猜你喜欢
  • 2014-09-19
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多