1

我有一个包含数百列和行的列表。我正在做的是循环遍历几乎所有可能的迭代,以获取两列之间的差异。例如,取第 1 列和第 2 列、第 1 列和第 3 列之间的差异……第 1 列和第 500 列……第 499 列和第 500 列。一旦我有了这些差异,我就会计算一些描述性统计数据(即平均值、标准偏差、峰度、偏度等)以用于输出。我知道我可以使用 lapply 单独计算每一列的统计数据,但是 sd(x)-sd(y) <> sd(xy) 所以它并没有真正减少我的循环。我可以使用 avg(x)-avg(y)=avg(xy) 但这是我可以使用此属性的唯一统计数据。

这是我拥有的一些伪代码:

    for (n1 in 1:(number of columns) {
        for (n2 in n1:(number of columns) {
            temp<-bigdata[n1]-bigdata[n2]
                 results[abc]<-(maxdrawdown,mean,skewness,kurtosis,count,st dev,
                       median, downsidedeviation)
         }
         }

这样做可能需要几天的时间,所以我正在寻找一些改进。我已经在使用Compiler了,enableJIT(3)它实际上确实使它明显更快。我还有其他一些想法,任何煽动都会有所帮助。一个是尝试利用降雪包(仍然试图让我了解如何实现它),并认为一个核心可以计算偏斜和峰度,而另一个核心可以计算其他统计数据。另一个想法是创建大块 temp(即 1-2、1-3、1-4)作为另一个 data.frame(或列表),以便对它使用 lapply 来一次淘汰许多迭代。这会有很大的不同吗?还有什么我可以做的,我什至没有想到的吗?

4

2 回答 2

1

一个可重复的例子真的很有帮助,因为你描述问题的方式令人困惑(例如列表没有行/列)。我的猜测是,bigdata并且results是 data.frames,在这种情况下,将它们中的每一个转换为矩阵将使您的循环明显更快。

于 2012-12-14T14:57:33.353 回答
0

我不知道它是否会更快,但以下内容可能会使代码更容易阅读,如果不是更快的话,虽然它也应该变得更快一些,因为你已经消除了for() ....

尝试使用expand.grid(),我倾向于使用的频率低于我应该使用的频率

例如:

nC <- 3 # Num of cols
nR <- 4 # Num of cols
indices <- expand.grid(nC, nC)
# Now you can use apply cleanly
apply(indices, 1,
   function(x) {
      c1 <- x[1]; c2 <- x[2]
      yourResult[c1,c2] <- doYourThing(bigData[,c1], bigData[,c2])
   }
)

反正你懂这个意思。:-)

于 2012-12-12T20:00:39.043 回答