Mam dużą ramkę danych (3M + rzędy). Próbuję policzyć liczbę razy, gdy określony parametr ActivityType pojawia się w 21-dniowym oknie. Mam modelowane moje rozwiązanie od Rolling Sum by Another Variable in R. Ale zajmuje tylko jeden typ ActivityType. Nie sądziłem, że 3M + wiersze to coś, co zajmie nadmierną ilość czasu. Poniżej jest co starałem:Najszybszy sposób na zrobienie 21-dniowej sumy kroczącej dla ActivityType
dt <- read.table(text='
Name ActivityType ActivityDate
John Email 1/1/2014
John Email 1/3/2014
John Webinar 1/5/2014
John Webinar 1/20/2014
John Webinar 3/25/2014
John Email 4/1/2014
John Email 4/20/2014
Tom Email 1/1/2014
Tom Webinar 1/5/2014
Tom Webinar 1/20/2014
Tom Webinar 3/25/2014
Tom Email 4/1/2014
Tom Email 4/20/2014
', header=T, row.names = NULL)
library(data.table)
library(reshape2)
dt$ActivityType <- factor(dt$ActivityType)
dt$ActivityDate <- as.Date(dt$ActivityDate, "%m/%d/%Y")
dt <- dt[order(dt$Name, dt$ActivityDate),]
dt <- dcast(dt, Name + ActivityDate ~ ActivityType, fun.aggregate=length)
setDT(dt)
#Build reference table
Ref <- dt[,list(Compare_Value=list(I(Email)),Compare_Date=list(I(ActivityDate))), by=c("Name")]
#Use mapply to get last 21 days of value by Name
dt[,Email_RollingSum := mapply(ActivityDate=ActivityDate,Name=Name, function(ActivityDate, Name) {
d <- as.numeric(Ref$Compare_Date[[Name]] - ActivityDate)
sum((d <= 0 & d >= -21)*Ref$Compare_Value[[Name]])})]
I to jest właśnie dla ActivityType = Email, to muszę zrobić to samo dla innych poziomów ActivityType. Link, z którego otrzymałem rozwiązanie, mówił o używaniu "mcapply" zamiast "mapply". Uprzejmie proszę mi powiedzieć, w jaki sposób mogę użyć mcapply lub innego rozwiązania, które przyspieszy działanie.
Poniżej przedstawiono oczekiwane wyniki. Dla każdego wiersza biorę ActivityDate i 21 dni wcześniej, a ten 21-dniowy okres jest moim oknem czasowym. Liczę cały czas ActivityType = "Email" pojawia się w tym oknie czasowym.
Name ActivityType ActivityDate Email_RollingSum
John Email 1/1/2014 1
John Email 1/3/2014 2
John Webinar 1/5/2014 2
John Webinar 1/20/2014 2
John Webinar 3/25/2014 0
John Email 4/1/2014 1
John Email 4/20/2014 2
Tom Email 1/1/2014 1
Tom Webinar 1/5/2014 1
Tom Webinar 1/20/2014 1
Tom Webinar 3/25/2014 0
Tom Email 4/1/2014 1
Tom Email 4/20/2014 2
często konwertować moje daty, aby numeryczne gdy ma do czynienia z milionami wierszy. as.numeric (dt $ ActivityDate). Nie rozwiązanie, ale być może poprawa. – Jordan
Ponieważ OP jest wyraźnie o prędkości, dobrze byłoby zaktualizować go o czasy, które otrzymałeś różnymi metodami. – eddi
Podejście WaltS trwało 1,89 godziny. Z jakiegoś powodu zabrakło mi pamięci dwa razy, próbując podejść Eddiego. Podejście Khasany trwało (nieco ponad 2 godziny), gdy program Excel wyłączył komputer. – gibbz00