R:循环遍历大型数据集需要很长时间

时间:2011-12-12 10:15:31

标签: r loops size

我需要将R中的Mann Kendall趋势测试应用于大量(约100万)不同大小的时间序列。我已经创建了一个像这样的.txt文件:

1 2
1 4
1 5
2 4
2 55
3 2
3 4
3 5
3 4
3 55
...

第一列的每个数字都标识一个特定的时间序列。要获取我正在使用此代码的统计信息:

library(Kendall)
a=read.table("to_r.txt")
numData=1017135

for (i in 1:numData){

s1=subset(a,a$V1==i)
m=MannKendall(s1$V2)
cat(m[[1]],"  ",m[[2]], "  ", m[[3]],"  ",m[[4]],"  ", m[[5]], "\n" ,   file="monotonic_trend_checking.txt",append=TRUE)
}

这种方法有效,但问题是计算需要很长时间。时间序列最多800个元素(只有少数,另一个更短)所以我认为主要的瓶颈在循环中。 你能建议更快的方法吗?

3 个答案:

答案 0 :(得分:4)

如果您认为循环是问题,我肯定会看看data.table。我最近写了一篇博文,比较了几种循环方式:

http://www.numbertheory.nl/2011/10/28/comparison-of-ave-ddply-and-data-table/

主要的信息是,当唯一身份证的数量(即您的时间序列数量)非常大时,data.table表现得非常好。

答案 1 :(得分:3)

这是一个非常简单的解决方案,可以将数据集拆分为多个部分,然后将MannKendall应用于每个部分。

# example dataset
d <- data.frame(a=rnorm(1e6), b=rep(1:1000, each=1000))

mk <- lapply(split(d$a, d$b), MannKendall)

这在我的机器上大约需要十秒钟,这是一个运行Windows 7的中等强大的桌面。结果是一个列表;这是第一个组成部分:

> mk[[1]]
tau = 0.0319, 2-sided pvalue =0.13133

如果您想在数据框中全部使用:

mk <- do.call(rbind, mk)

答案 2 :(得分:1)

一个很大的问题是,您要将结果写入每个时间序列的文件中。文件访问需要时间。最好创建一个包含所有结果的大型数据表,然后在最后使用write.table()一次。

当然,这假设您有足够的RAM来保存原始数据表和新结果表在内存中,这可能不是一个大问题。