Мне нужно обработать огромный набор данных из миллионов записей в следующем формате:
Таблица: посещения
|----------------|--------------|------------|
| PERSON_ID | DATE | #Clicks |
|----------------|--------------|------------|
| 1 | 2017-05-04 | 4 |
| 1 | 2018-05-04 | 1 |
| 1 | 2016-02-04 | 5 |
| 1 | 2018-05-06 | 7 |
| 2 | 2018-05-04 | 8 |
| 2 | 2018-05-16 | 1 |
| 2 | 2018-01-04 | 1 |
| 2 | 2018-02-04 | 2 |
| ... | ... | ... |
|----------------|--------------|------------|
Я хочу посчитать количество кликов за каждый день + 30 следующих дней.
Данные
N = 2000000
Лица = 15000
перебор каждого человека занимает около 1 секунды, это замедление.
Любой совет о том, как настроить код будет приветствоваться.
Я уже пытался использовать apply / lapply без особого успеха.
Пример кода:
библиотека (lubridate);
#Initial Data Set
visits <- data.frame(person_id=c(1,1,1,1,2,2,2,2),
date=c(ymd("2017-05-04"),ymd("2018-05-04"),ymd("2016-02-04"),ymd("2018-05-06"),ymd("2018-05-04"),ymd("2018-05-16"),ymd("2018-01-04"),ymd("2018-02-04")),
clicks=c(4,1,5,7,8,1,1,2),
clicks_30days=0)
unique_visitors <- unique(visits$person_id)
#For Each Person
for(person_id in unique_visitors)
{
#Subset person's records and order the, descending
person_visits <- visits[visits$person_id == person_id,]
person_visits <- person_visits[order(person_visits$date),]
#For each visit count the # of clicks of the visit + all visits within visit's date + 30 days
for(i in 1:nrow(person_visits))
{
search_interval <- interval( person_visits$date[i] , person_visits$date[i]+days(30))
#####This is the interesting codeline#####
calc_result <- sum(person_visits$clicks[person_visits$date %within% search_interval])**
##########################################
#save the clicks + 30 days
visits[rownames(person_visits)[i],"clicks_30days"] <- calc_result
}
}
Все, что быстрее, чем это действительно очень ценится.