我有一个包含数百个列和行的列表。我正在做的是循环几乎所有可能的迭代,取两列之间的差异。例如,取第1列和第2列,第1列和第3列之间的差异。第1列和第500列...第499列和第500列。一旦我有了这些差异,我就会为输出计算一些描述性统计数据(即。mean,st dev,kurtosis,skewness等)。我知道我可以使用lapply来单独计算每列的统计数据,但是sd(x)-sd(y)<> sd(x-y)所以它并没有真正减少我的循环。我可以使用avg(x)-avg(y)= avg(x-y),但这是我可以使用此属性的唯一统计数据。
这是我的一些伪代码:
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)
}
}
这样做可能需要几天时间,所以我正在寻找一些改进。我已经将编译器与enableJIT(3)
一起使用,这实际上确实让它明显加快了。我有其他一些想法,任何煽动都会有所帮助。一个是试图利用降雪包(仍然试图了解如何实现它),认为一个核心可以计算偏斜和峰度,而另一个计算其他统计数据。另一个想法是创建大块的temp(即1-2,1-3,1-4)作为另一个data.frame(或列表),以便对它使用lapply来立即淘汰多次迭代。这会有很大的不同吗?还有什么我可以做的,我甚至都没想过?
答案 0 :(得分:1)
可重复的示例确实会有所帮助,因为您描述问题的方式令人困惑(例如,列表没有行/列)。我的猜测是bigdata
和results
是data.frames,在这种情况下,将每个转换为矩阵会使你的循环明显加快。
答案 1 :(得分:0)
我不知道它是否会更快,但是如果不是更快的话,下面的代码可能会使代码更容易阅读,尽管它也应该更快一点,因为你已经消除了{{1} }。
尝试使用for() ...
,我倾向于使用的频率低于我可能应该使用
例如:
expand.grid()
嗯,你明白了。 : - )