R читать из файла массивов разных размеров - PullRequest
1 голос
/ 08 декабря 2011

Мне нужно применить тренд-тест Манна Кендалла в R к большому количеству (около 1 миллиона) временных рядов разных размеров.Я уже создал скрипт, который берет временные ряды (практически список чисел) из всех файлов в определенном каталоге, а затем выводит результаты в файл .txt.

Проблема в том, что у меня около 1 миллиона временных рядов, поэтому создание 1 миллиона файлов не совсем удобно.Поэтому я подумал, что поместить все временные ряды только в один файл .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)
}

Этот подход работает, но проблема в том, что он требует возрастов для вычислений.Можете ли вы предложить более быстрый подход?

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Если бы вы пронумеровали наборы данных по мере их поступления в больший файл, это бы упростило задачу.Если бы вы сделали это, вы могли бы использовать цикл 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
}
1 голос
/ 08 декабря 2011

Вот, пожалуй, более элегантное решение:

# 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)]))

Обратите внимание, что для работы этого кода у вас должен быть символ '#' в самом конце файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...