2011-12-07 107 views
1

我需要将R中的Mann Kendall趋势测试应用于大数量(大约100万)不同大小的时间序列。我已经创建了一个脚本,它从某个目录中的所有文件中获取时间序列(实际上是一个数字列表),然后将结果输出到.txt文件。R从文件大小不同的数组中读取

问题是我有大约100万的时间序列,所以创建100万个文件并不完全好。所以我认为把所有时间序列放在一个.txt文件中(例如用“#”之类的符号分隔)可能更易于管理。所以我有一个这样的文件:

1 
2 
4 
5 
4 
# 
2 
13 
34 
# 
... 

我想知道,是否有可能R中提取(在两个“#”)等系列,然后应用分析?

编辑

继@acesnap提示我正在使用此代码:

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) 
} 

这种方法的作品,但问题是,它正在为年龄计算。你能建议一个更快的方法吗?

+0

如果您有新问题,最好的做法是重新发布一个新问题。特别是因为已经有一个被接受的答案。 –

+1

@PaulHiemstra我会按照你的提示 – markusian

+1

这是否可以加快取决于瓶颈是什么。如果是循环,你可以看看data.table包中的data.table。如果是MannKendall测试,那么加速可能会更困难。 –

回答

2

如果您要在数据集进入较大文件时进行编号,它会使事情变得更容易。如果你这样做,你可以使用for循环和子集。

setNum  data 
    1   1 
    1   2 
    1   4 
    1   5 
    1   4 
    2   2 
    2   13 
    2   34 
...   ... 

然后做这样的事情:

answers1 <- c() 
numOfDataSets <- 1000000 
for(i in 1:numOfDataSets){ 
    ss1 <- subset(bigData, bigData$setNum == i) ## creates subset of each data set 
    ans1 <- mannKendallTrendTest(ss1$data)  ## gets answer from test 
    answers1 <- c(answers1, ans1)    ## inserts answer into vector 
    print(paste(i, " | ", ans1, "",sep="")) ## prints which data set is in use 
    flush.console()        ## prints to console now instead of waiting 
} 
+0

我跟着你的提示,我正在使用我张贴的代码。问题在于它太慢了。你能提出其他建议吗? – markusian

1

这里是一个或许更优雅的解决方案:

# Read in your data 
x=c('1','2','3','4','5','#','4','5','5','6','#','3','6','23','#') 
# Build a list of indices where you want to split by: 
ind=c(0,which(x=='#')) 
# Use those indices split the vector into a list 
lapply(seq(length(ind)-1),function (y) as.numeric(x[(ind[y]+1):(ind[y+1]-1)])) 

请注意,此代码工作,你必须有一个 '#'字符在文件的最后。