私は大きなデータフレーム(3M +行)を持っています。私は特定のActivityTypeが21日のウィンドウに表示される回数を数えようとしています。私はRolling Sum by Another Variable in Rから私のソリューションをモデル化しました。しかし、1つのActivityTypeには長い時間がかかります。私は、3M +の行が過度の時間を要するものだとは思わなかった。以下は私が試したものです:ActivityTypeの21日のローリング合計を行う最速の方法
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]])})]
これはActivityType = Emailの場合だけで、他のActivityTypeレベルでも同じことをしなければなりません。私が解決策を得たリンクは、「mapply」ではなく「mcapply」を使って話しました。 mcapplyや他のどのようなソリューションを使ってより速くできるのか教えてください。
以下は予想される出力です。各行について、私はActivityDateを21日前に取って、21日の期間は私のタイムウィンドウです。私はその時間枠内にActivityType = "Email"と表示されます。
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
数百万行を扱うとき、私は、多くの場合、数値に私の日付を変換。 as.numeric(dt $ ActivityDate)。解決策ではなく、おそらく改善点です。 – Jordan
OPは明示的に速度に関するものなので、様々な方法で得たタイミングでOPを更新するとよいでしょう。 – eddi
WaltSのアプローチは1.89時間かかりました。何らかの理由で、私はeddiのアプローチを試している間に2回メモリ不足になりました。 Excelが私のコンピュータを墜落させたとき、Khasanaのアプローチは走っていた(わずか2時間以上)。 – gibbz00