Tôi có một dataframe lớn (3M + hàng). Tôi đang cố đếm số lần một ActivityType nhất định xuất hiện trong cửa sổ 21 ngày. Tôi đã lập mô hình giải pháp của mình từ Rolling Sum by Another Variable in R. Nhưng phải mất một thời gian dài chỉ cho một ActivityType. Tôi không nghĩ rằng các hàng 3M + là thứ sẽ mất một lượng thời gian vô hạn. Dưới đây là những gì tôi đã thử:Cách nhanh nhất để thực hiện 21 ngày sum lăn cho một 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]])})]
Và điều này chỉ dành cho ActivityType = Email, sau đó tôi phải làm tương tự cho các cấp độ khác của ActivityType. Liên kết mà tôi đã nhận được giải pháp từ nói về việc sử dụng "mcapply" thay vì "mapply". Vui lòng cho tôi biết làm thế nào tôi có thể sử dụng mcapply hoặc bất kỳ giải pháp khác mà sẽ làm cho nó nhanh hơn.
Dưới đây là kết quả mong đợi. Đối với mỗi hàng, tôi lấy ActivityDate và 21 ngày trước đó và thời gian 21 ngày là cửa sổ thời gian của tôi. Tôi đếm mọi lúc ActivityType = "Email" xuất hiện trong cửa sổ thời gian đó.
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
Tôi thường chuyển đổi ngày thành số khi xử lý hàng triệu hàng. as.numeric (dt $ ActivityDate). Không phải là một giải pháp nhưng có lẽ là một sự cải tiến. – Jordan
Kể từ khi OP là một cách rõ ràng về tốc độ nó sẽ là tốt để cập nhật nó với timings bạn có với các phương pháp khác nhau. – eddi
Cách tiếp cận bởi WaltS mất 1,89 giờ. Vì lý do nào đó, tôi đã hết bộ nhớ hai lần trong khi thử cách tiếp cận của eddi. Cách tiếp cận của Khasana đang chạy (một ít hơn 2 giờ) khi excel đâm máy tính của tôi. – gibbz00