По сравнению с исходной настройкой ...
> subsetted.dates <- da[0,]
> system.time(for(i in 1:length(first.times)){
+ subsetted.dates <- rbind(subsetted.dates, da[da$dates >= first.times[i] & da$dates < second.times[i],])
+ })
user system elapsed
3.97 0.35 4.33
... можно получить небольшое улучшение производительности, используя lapply
:
> system.time({
+ subsetted.dates <- lapply(1:length(first.times),function(i) da[da$dates >= first.times[i] & da$dates < second.times[i],])
+ subsetted.dates <- do.call(rbind,subsetted.dates)
+ })
user system elapsed
3.37 0.26 3.75
Немного изменивАлгоритм, если вы сначала создаете индекс дат с немного меньшим набором данных, а затем применяете его, это приводит к еще лучшей производительности:
> system.time({
+ da_dates <- da$dates
+ da_inds <- lapply(1:length(first.times),function(i) which(da_dates >= first.times[i] & da_dates < second.times[i]))
+ subsetted.dates <- da[unlist(da_inds),]
+ })
user system elapsed
2.60 0.31 2.94
Предположение, что интервалы времени равныможно упорядочить по временному порядку (в этом случае они уже были по временному порядку) и что они не перекрываются, проблема становится еще быстрее:
system.time({
da_date_order <- order(da$dates)
da_date_back_order <- order(da$dates)
da_sorted_dates <- sort(da$dates)
da_selected_dates <- rep(FALSE,length(da_sorted_dates))
j = 1
for (i in 1:length(da_dates)) {
if (da_sorted_dates[i] >= first.times[j] & da_sorted_dates[i] < second.times[j]) {
da_selected_dates[i] <- TRUE
} else if (da_sorted_dates[i] >= second.times[j]) {
j = j + 1
if (j > length(second.times)) {
break
}
}
}
subsetted.dates <- da[da_date_back_order[da_selected_dates],]
})
user system elapsed
0.98 0.00 1.01
И если вы разрешите сортировку исходного набора данных da
тогда решение будет еще быстрее:
system.time({
da <- da[order(da$dates),]
da_sorted_dates <- da$dates
da_selected_dates <- rep(FALSE,length(da_sorted_dates))
j = 1
for (i in 1:length(da_dates)) {
if (da_sorted_dates[i] >= first.times[j] & da_sorted_dates[i] < second.times[j]) {
da_selected_dates[i] <- TRUE
} else if (da_sorted_dates[i] >= second.times[j]) {
j = j + 1
if (j > length(second.times)) {
break
}
}
}
subsetted.dates <- da[da_selected_dates,]
})
user system elapsed
0.63 0.00 0.63