У меня есть большой datframe (около 3 миллионов строк), которые содержат ID, год и три даты каждый: lookupdate
, date1
и date2
. data.frame
сортируется по ID
и date1
. Я хочу, чтобы выполнить поиск по всему набору данных и найти записи i
которых:Ускорение вложенных циклов в R
- имеют
financial_year == 2013
и - содержат один и тот же
ID
, как и любой другой линииj
таким образом, чтоdate1[j] < lookupdate[i] < date2[j]
Я реализованного эта логика ниже, но это смехотворно медленно. Вы знаете, как ускорить этот код?
calc_hits_bruteforce <- function(d){
N <- nrow(d)
hits <- rep(FALSE, N)
for (i in 2:N) {
if(d[i,"financial_year"]!=2013) next
for (j in i:1) {
if (d[i,"ID"]!=d[j,"ID"]) {
break
}
else {
if (d[j,"date1"] < d[i,"lookupdate"] & d[j, "date2"] > d[i, "lookupdate"]) {
hits[i] <- TRUE
break
}
}
}
}
hits
}
Я не знаю, сколько записей есть для каждого ID
, но я знаю lookupdate
для каждой записи лежит перед date1
и date2
, т.е. lookupdate[i] < date1[i] < date2[i]
для всех i
.
Вот пример dataframe и выход:
> d.ex
ID lookupdate date1 date2 financial_year
1 C143896B 2011-02-24 2011-11-09 2011-11-21 2011
2 C143896G 2010-11-23 2011-10-29 2011-11-21 2011
3 C143896G 2011-11-11 2012-10-12 2012-11-05 2012
4 C143896G 2012-06-17 2013-01-30 2013-02-11 2013
5 C143896G 2012-10-31 2013-09-15 2013-09-29 2013
> calc_hits_bruteforce(d.ex)
[1] FALSE FALSE FALSE FALSE TRUE
В последней строке это значение TRUE, поскольку 2012-10-12 < < 2012-10-31 2012-11-05.
Вложенные циклы очень трудно читать. Лучшей практикой было бы, если вы добавите ** минимальный воспроизводимый пример ** с ** желаемым выходом ** –
Спасибо, добавлен пример. – phildeutsch
Должно ли financial_year == 2013 или financial_year! = 2013? – DJJ