Tôi nghĩ rằng tôi đang sử dụng plyr không chính xác. Ai đó có thể vui lòng cho tôi biết nếu đây là mã plyr 'hiệu quả'?Tại sao plyr lại quá chậm?
require(plyr)
plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume))
Một ngữ cảnh nhỏ: Tôi có một vài vấn đề về tập hợp lớn và tôi đã lưu ý rằng họ đã dành một chút thời gian. Khi cố gắng giải quyết các vấn đề, tôi đã trở nên quan tâm đến việc thực hiện các quy trình tổng hợp khác nhau trong R.
Tôi đã thử nghiệm một vài phương pháp tổng hợp - và thấy mình đang chờ cả ngày.
Khi tôi cuối cùng đã nhận được kết quả, tôi phát hiện ra một khoảng cách lớn giữa phương pháp plyr và những người khác - điều đó khiến tôi nghĩ rằng tôi đã làm điều gì đó sai trái.
Tôi chạy đoạn mã sau (tôi nghĩ rằng tôi muốn kiểm tra gói dataframe mới trong khi tôi đang ở đó):
require(plyr)
require(data.table)
require(dataframe)
require(rbenchmark)
require(xts)
plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume))
t.apply <- function(dd) unlist(tapply(dd$volume, dd$price, sum))
t.apply.x <- function(dd) unlist(tapply(dd[,2], dd[,1], sum))
l.apply <- function(dd) unlist(lapply(split(dd$volume, dd$price), sum))
l.apply.x <- function(dd) unlist(lapply(split(dd[,2], dd[,1]), sum))
b.y <- function(dd) unlist(by(dd$volume, dd$price, sum))
b.y.x <- function(dd) unlist(by(dd[,2], dd[,1], sum))
agg <- function(dd) aggregate(dd$volume, list(dd$price), sum)
agg.x <- function(dd) aggregate(dd[,2], list(dd[,1]), sum)
dtd <- function(dd) dd[, sum(volume), by=(price)]
obs <- c(5e1, 5e2, 5e3, 5e4, 5e5, 5e6, 5e6, 5e7, 5e8)
timS <- timeBasedSeq('20110101 083000/20120101 083000')
bmkRL <- list(NULL)
for (i in 1:5){
tt <- timS[1:obs[i]]
for (j in 1:8){
pxl <- seq(0.9, 1.1, by= (1.1 - 0.9)/floor(obs[i]/(11-j)))
px <- sample(pxl, length(tt), replace=TRUE)
vol <- rnorm(length(tt), 1000, 100)
d.df <- base::data.frame(time=tt, price=px, volume=vol)
d.dfp <- dataframe::data.frame(time=tt, price=px, volume=vol)
d.matrix <- as.matrix(d.df[,-1])
d.dt <- data.table(d.df)
listLabel <- paste('i=',i, 'j=',j)
bmkRL[[listLabel]] <- benchmark(plyr(d.df), plyr(d.dfp), t.apply(d.df),
t.apply(d.dfp), t.apply.x(d.matrix),
l.apply(d.df), l.apply(d.dfp), l.apply.x(d.matrix),
b.y(d.df), b.y(d.dfp), b.y.x(d.matrix), agg(d.df),
agg(d.dfp), agg.x(d.matrix), dtd(d.dt),
columns =c('test', 'elapsed', 'relative'),
replications = 10,
order = 'elapsed')
}
}
Xét nghiệm này được cho là để kiểm tra lên đến 5e8, nhưng phải mất quá nhiều thời gian - chủ yếu là do plyr. Bảng 5e5 cuối cùng cho biết vấn đề:
$`i= 5 j= 8`
test elapsed relative
15 dtd(d.dt) 4.156 1.000000
6 l.apply(d.df) 15.687 3.774543
7 l.apply(d.dfp) 16.066 3.865736
8 l.apply.x(d.matrix) 16.659 4.008422
4 t.apply(d.dfp) 21.387 5.146054
3 t.apply(d.df) 21.488 5.170356
5 t.apply.x(d.matrix) 22.014 5.296920
13 agg(d.dfp) 32.254 7.760828
14 agg.x(d.matrix) 32.435 7.804379
12 agg(d.df) 32.593 7.842397
10 b.y(d.dfp) 98.006 23.581809
11 b.y.x(d.matrix) 98.134 23.612608
9 b.y(d.df) 98.337 23.661453
1 plyr(d.df) 9384.135 2257.972810
2 plyr(d.dfp) 9384.448 2258.048123
Điều này có đúng không? Tại sao plyr 2250x chậm hơn data.table
? Và tại sao không sử dụng gói khung dữ liệu mới tạo nên sự khác biệt?
Thông báo thông tin phiên là:
> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] xts_0.8-6 zoo_1.7-7 rbenchmark_0.3 dataframe_2.5 data.table_1.8.1 plyr_1.7.1
loaded via a namespace (and not attached):
[1] grid_2.15.1 lattice_0.20-6 tools_2.15.1
Đối với vấn đề thao tác dữ liệu/tập hợp tương đối đơn giản, tôi đã tìm thấy là cực kỳ nhanh chóng. Nếu nó có thể làm điều đó, tôi không ngạc nhiên khi nó là người chiến thắng rõ ràng. Tôi không quen thuộc với 'plyr' để bình luận về nó. – Joshua
Bạn đã xem tài liệu về 'plyr' và' data.table' chưa? Nếu tôi nhớ chính xác, 'plyr' làm việc với base-'R'' data.frame's. 'data.table' sử dụng một biểu diễn hoàn toàn khác, sử dụng các cột có khóa và phân loại radix hiệu quả. Nó giống như cơ sở dữ liệu nhiều hơn theo cách này. –
tôi đã có một cái nhìn - nhưng không thể tìm ra. plyr là nhiều hơn chỉ là một chút chậm hơn ... gia đình áp dụng, agg, và bởi rất nhanh chóng - và họ là cơ sở. đó là lý do tại sao tôi nghĩ rằng tôi phải làm một số lỗi tân binh với plyr. – ricardo