2014-02-13 5 views
0

Я пишу этот код для прохождения данных и сравнения значений. Это мой код:Оптимизация цикла в R

for (t in 1:(length(prob_times_start_new))){ 
count3 <- 0 
testcount <- 0 
dates <- c() 
count2 <- 0 
for(n in 1:length(ob_times)){ 
    issue <- substr(prob_times_start_new[t],1,10) 
    issue2 <- substr(prob_times_end_new[t],1,10) 
    count2 <- count2 + 1 
    if (grepl(issue,ob_times[n])|grepl(issue2,ob_times[n])){ 
     if ((ob_times[n] >= prob_times_start_new[t]) & (ob_times[n] <= prob_times_end_new[t])){ 
      count3 <- count3 + 1} 
     if ((ob_times[n] >= prob_times_start_new[t]) & (ob_times[n] <= prob_times_end_new[t]) & (count3 <= 1)){ 

      if (probs_new[t] == "PROB30"){ 
       num_of_hits30 <- num_of_hits30 + 1} 
      else if (probs_new[t] == "PROB40"){ 
       num_of_hits40 <- num_of_hits40 + 1} 
      } 
     if ((ob_times[n]<prob_times_start_new[t]) | (ob_times[n] > prob_times_end_new[t])){ 
      testcount <- testcount + 1} 
     dates <- c(dates,ob_times[n]) 
     } 

    nums <- length(ob_times) 
    if ((!(grepl(issue,ob_times[nums])))&(!(grepl(issue2,ob_times[1])))){ 

     if (((prob_times_start_new[t]>ob_times[nums])|(prob_times_end_new[t]<ob_times[1]))&count2<=1){ 

      if (probs_new[t] == "PROB30"){ 
       num_of_false30 <- num_of_false30 + 1} 
      else if (probs_new[t] == "PROB40"){ 
       num_of_false40 <- num_of_false40 + 1}}}} 
if((!(is.null(dates)))){ 
    if((testcount==length(dates))){ 

     if (probs_new[t] == "PROB30"){ 
      num_of_false30 <- num_of_false30 + 1} 
     else if (probs_new[t] == "PROB40"){ 
      num_of_false40 <- num_of_false40 + 1}}} 


for (k in 2:length(ob_times)){ 
    if(((!(grepl(issue,ob_times[k])))&(!(grepl(issue2,ob_times[k]))))&((!(grepl(issue,ob_times[k-1]))) & (!(grepl(issue,ob_times[k-1]))))){ 
     if ((prob_times_start_new[t]>ob_times[k-1]) & (prob_times_start_new[t]<ob_times[k]) & (prob_times_end_new[t]>ob_times[k-1]) & (prob_times_end_new[t]<ob_times[k])){ 

      if (probs_new[t] == "PROB30"){ 
       num_of_false30 <- num_of_false30 + 1} 
      else if (probs_new[t] == "PROB40"){ 
       num_of_false40 <- num_of_false40 + 1}}}}} 

prob_times_start_new и prob_times_end_new и ob_times векторы со строками в этом формате,

"2010-03-12 22:12:20" (Year-Month-Day Hour:Minute:Second) 

probs_new только вектор или с "PROB30" или "PROB40" num_of_false30, num_of_false40 , num_of_hits30, num_of_hits40 - целые числа, начинающиеся с 0 и подсчет в соответствии с критериями в коде.

Я знаю, что это много кода и задавайте вопросы, если вы не понимаете какой-либо код. То, что это должно делать, это поиск по вектору и проверка того, что что-либо в ob_times находится между начальным и конечным временным интервалом, если оно делает это, и если это не ложь.

Прямо сейчас, когда я запускаю этот код, он работает, но для этого требуется около 2 минут. Это сэкономит мне много времени, если я смогу добиться этого быстрее. Я видел несколько сообщений о верторизации, но я попытался сделать это сам, но не повезло. Если бы кто-то мог мне помочь, это было бы очень признательно. Заранее спасибо

ответ

1

Выделите векторы перед использованием. Например, у вас есть

dates <- c() 

Заменить, что с

dates <- vector('Date', length) 

для любой длины может быть. Затем, вместо конкатенации даты, доступ к элементу

dates[n] <- value 

Это даст вам максимальную отдачу от затраченных средств.

+0

Точно. Строка 'date <- c (date, ob_times [n])' замедляет ваш код, потому что он растет в каждом цикле. –

+0

Спасибо за ответы, я изменил это, но он все еще очень медленный. Когда я комментирую, операторы if в цикле for идут очень быстро, но когда они там, это очень медленно. – user3307321

Смежные вопросы