【发布时间】:2012-11-30 14:06:33
【问题描述】:
我有一个包含数百列和行的列表。我正在做的是循环遍历几乎所有可能的迭代,以获取两列之间的差异。例如,取第 1 列和第 2 列、第 1 列和第 3 列之间的差异……第 1 列和第 500 列……第 499 列和第 500 列。一旦有了这些差异,我就会计算一些描述性统计数据(即均值、标准偏差、峰度、偏度等)以用于输出。我知道我可以使用 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)
}
}
这样做可能需要几天时间,所以我正在寻找一些改进。我已经将 Compiler 与enableJIT(3) 一起使用,这确实使它明显更快。我还有其他一些想法,任何煽动都会有所帮助。一个是尝试利用降雪包(仍然试图让我了解如何实现它),并认为一个核心可以计算偏斜和峰度,而另一个核心可以计算其他统计数据。另一个想法是创建大块 temp(即 1-2、1-3、1-4)作为另一个 data.frame(或列表),以便对它使用 lapply 来一次淘汰许多迭代。这会有很大的不同吗?还有什么我想都不敢想的事情吗?
【问题讨论】:
-
*apply函数应该(快得多),虽然我手头没有数据,而且它们很容易使用 -
@ChrisW:我想你会发现 *apply 并不比循环快。它们当然更紧凑和更具表现力,但基准测试它们通常具有相同的性能。内部功能通常是瓶颈。
-
你需要提供一个可重现的例子,特别是因为你用来描述你的问题的词非常混乱。列表没有行/列,它们只有元素。我的猜测是
bigdata是一个data.frame,在这种情况下将bigdata转换为矩阵会明显更快。 -
@DWin,嗯,你可能是对的,尽管quora.com/R-software/… 的答案似乎另有说明。我想这取决于很多因素
-
@ChrisW:第一个示例的最大问题是
apply将X转换为矩阵,因此他们实际上是在将矩阵子集(很快)与 data.frame 子集(这很慢)......但将速度差异归因于循环。
标签: r