Можно ли улучшить производительность цикла или улучшить скорость завершения с помощью альтернативных вариантов? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть вложенный цикл for, который проходит через каждую строку в наблюдении 800 000+ data.frame, называемом alltrx. Он проверяет, находится ли каждое значение в отформатированном Posixct столбце TIME в alltrx в пределах интервала дат, созданного из значений в секунду data.frame, называемых long. Если условие истинно, цикл берет номер строки из «правильной» строки, для которой интервал дат был получен из long, и помещает его в новый столбец alltrx$Survey. Насколько я могу судить, это работает, но я попробовал с индикатором выполнения и получил только 4% за один час. Я хотел бы спросить, есть ли у кого-нибудь идеи о том, как ускорить это? У меня также есть alltrx в качестве списка списков, где данные разделены между списками (таким образом, что имеет смысл для моего проекта).

Я смотрел на это и это , но это, казалось, не давало большого шанса на повышение скорости, в то время как второе не очень помогало ...

.... см. Мой код ниже


for (i in 1:nrow(alltrx)){ 
  for (j in 1:nrow(long)) {
    if(alltrx$TIME2[i] %within% 
       (interval(ymd(long$V2[j]), ymd(long$V1[j])))){alltrx$Survey[i]<-row.name(long[j])}
  }
}

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

1 Ответ

0 голосов
/ 08 июля 2019

В итоге этот процесс был значительно ускорен (5 минут по сравнению с ~ 24 часами), обработав большой фрейм данных в виде серии списков, которые (я думаю) позволяют одновременно выполнять несколько процессов. Что касается интервала дат, то fuzzyjoin::left_fuzzy_join() был полезен при изложении условий, в которых аргумент match_fun позволяет определить условные отношения с каждой из 2 переменных, выбранных в аргументе by. Надеюсь, кто-то найдет это интересным или даже полезным: p

Для завершения приведенного ниже примера выполняется команда из моего скрипта. Примечание: исходный файл alltrx был разделен на список data.frame с названием alltrx.list


 fuzz.join <- lapply(alltrx.list, function(x){
      fuzzy_left_join(x, long, by = c("TIME" = "V1", "TIME" = "V2")
    , match_fun = list(`>=`, `<=`))
    })

...