Я пишу этот код для прохождения данных и сравнения значений. Это мой код:Оптимизация цикла в 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 минут. Это сэкономит мне много времени, если я смогу добиться этого быстрее. Я видел несколько сообщений о верторизации, но я попытался сделать это сам, но не повезло. Если бы кто-то мог мне помочь, это было бы очень признательно. Заранее спасибо
Точно. Строка 'date <- c (date, ob_times [n])' замедляет ваш код, потому что он растет в каждом цикле. –
Спасибо за ответы, я изменил это, но он все еще очень медленный. Когда я комментирую, операторы if в цикле for идут очень быстро, но когда они там, это очень медленно. – user3307321