Tổng quat
Tôi tương đối quen thuộc data.table
, không quá nhiều với dplyr
. Tôi đã đọc qua một số dplyr
họa tiết và ví dụ đã xuất hiện trên SO, và cho đến nay kết luận của tôi là:
data.table
vàdplyr
có thể so sánh về tốc độ, ngoại trừ khi có nhiều nhóm (ví dụ> 10-100K) và trong một số trường hợp khác (xem điểm chuẩn bên dưới)dplyr
có cú pháp dễ tiếp cận hơndplyr
tóm tắt (hoặc sẽ) các tương tác DB tiềm năng- Có một số khác biệt về chức năng nhỏ (xem "Ví dụ / Cách sử dụng" bên dưới)
Trong suy nghĩ của tôi 2. không chịu nhiều sức nặng vì tôi khá quen thuộc với nó data.table
, mặc dù tôi hiểu rằng đối với người dùng mới sử dụng cả hai thì đó sẽ là một yếu tố lớn. Tôi muốn tránh một cuộc tranh luận về vấn đề nào trực quan hơn, vì điều đó không liên quan đến câu hỏi cụ thể của tôi được hỏi từ quan điểm của một người đã quen thuộc data.table
. Tôi cũng muốn tránh một cuộc thảo luận về cách "trực quan hơn" dẫn đến phân tích nhanh hơn (chắc chắn là đúng, nhưng một lần nữa, không phải là điều tôi quan tâm nhất ở đây).
Câu hỏi
Điều tôi muốn biết là:
- Có các nhiệm vụ phân tích dễ dàng hơn rất nhiều để mã hóa với một hoặc gói khác cho những người quen thuộc với các gói (nghĩa là một số tổ hợp phím được yêu cầu so với mức độ bí truyền được yêu cầu, trong đó ít hơn là một điều tốt).
- Có các nhiệm vụ phân tích được thực hiện đáng kể (tức là hơn 2 lần) hiệu quả hơn trong một gói so với gói khác.
Một câu hỏi SO gần đây khiến tôi suy nghĩ về vấn đề này nhiều hơn một chút, bởi vì cho đến thời điểm đó tôi không nghĩ dplyr
sẽ cung cấp nhiều hơn những gì tôi có thể làm data.table
. Đây là dplyr
giải pháp (dữ liệu ở cuối Q):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
Điều đó tốt hơn nhiều so với nỗ lực hack của tôi tại một data.table
giải pháp. Điều đó nói rằng, data.table
các giải pháp tốt cũng khá tốt (cảm ơn Jean-Robert, Arun, và lưu ý ở đây tôi ủng hộ tuyên bố duy nhất trên giải pháp tối ưu nhất hoàn toàn):
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
Cú pháp cho cái sau có vẻ rất bí truyền, nhưng thực ra nó khá đơn giản nếu bạn đã quen data.table
(nghĩa là không sử dụng một số thủ thuật bí truyền hơn).
Lý tưởng nhất là những gì tôi muốn thấy là một số ví dụ dplyr
hay data.table
là cách thức ngắn gọn hơn hoặc thực hiện tốt hơn đáng kể.
Ví dụ
Sử dụngdplyr
không cho phép các hoạt động được nhóm trả về số lượng hàng tùy ý (từ câu hỏi của eddi , lưu ý: điều này có vẻ như sẽ được triển khai trong dplyr 0.5 , ngoài ra, @beginneR cho thấy một công việc tiềm năng sử dụngdo
trong câu trả lời cho câu hỏi của @ eddi).data.table
hỗ trợ tham gia cán (cảm ơn @dholstius) cũng như tham gia chồng chéodata.table
nội bộ tối ưu hóa các biểu thức của biểu mẫuDT[col == value]
hoặcDT[col %in% values]
cho tốc độ thông qua lập chỉ mục tự động sử dụng tìm kiếm nhị phân trong khi sử dụng cùng một cú pháp cơ sở R. Xem ở đây để biết thêm chi tiết và một điểm chuẩn nhỏ.dplyr
cung cấp các phiên bản đánh giá tiêu chuẩn của các chức năng (ví dụregroup
,summarize_each_
) có thể đơn giản hóa việc sử dụng theo chương trìnhdplyr
(lưu ý sử dụng theo chương trìnhdata.table
là hoàn toàn có thể, chỉ cần một số suy nghĩ cẩn thận, thay thế / trích dẫn, v.v., ít nhất là theo hiểu biết của tôi)
- Tôi đã chạy các điểm chuẩn của riêng mình và thấy cả hai gói có thể so sánh được trong phân tích kiểu "chia nhỏ áp dụng kết hợp", ngoại trừ khi có một số lượng rất lớn các nhóm (> 100K) tại đó điểm
data.table
trở nên nhanh hơn đáng kể. - @Arun đã chạy một số điểm chuẩn trên các phép nối , cho thấy
data.table
tỷ lệ tốt hơn sodplyr
với số lượng nhóm tăng lên (được cập nhật với các cải tiến gần đây trong cả hai gói và phiên bản R gần đây). Ngoài ra, điểm chuẩn khi cố gắng nhận các giá trị duy nhất códata.table
tốc độ nhanh hơn ~ 6 lần. - (Chưa được xác minh) có
data.table
tốc độ nhanh hơn 75% trên các phiên bản lớn hơn của nhóm / áp dụng / sắp xếp trong khidplyr
nhanh hơn 40% đối với các phiên bản nhỏ hơn ( một câu hỏi SO khác từ các bình luận , cảm ơn dana). - Matt, tác giả chính của
data.table
, đã benchmarked nhóm hoạt động trêndata.table
,dplyr
và pythonpandas
trên lên đến 2 tỷ hàng (~ 100GB trong RAM) . - Một điểm chuẩn cũ hơn trên các nhóm 80K có
data.table
tốc độ nhanh hơn ~ 8 lần
Dữ liệu
Đây là ví dụ đầu tiên tôi chỉ ra trong phần câu hỏi.
dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob",
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L,
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L,
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager",
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager",
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id",
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA,
-16L))
dplyr
và data.table
các đội đang làm việc trên điểm chuẩn, vì vậy một câu trả lời sẽ có ở một số điểm. # 2 (cú pháp) imO hoàn toàn sai, nhưng điều đó rõ ràng mạo hiểm vào lãnh thổ ý kiến, vì vậy tôi cũng đang bỏ phiếu để đóng.
(d)plyr
có biện pháp 0
dplyr
và plyr
liên quan đến cú pháp và về cơ bản là lý do chính khiến tôi không thích cú pháp của họ, là tôi phải học quá nhiều (đọc nhiều hơn 1) hàm bổ sung (với các tên vẫn còn đừng có ý nghĩa với tôi), hãy nhớ những gì họ làm, những gì họ đưa ra, v.v. Điều đó luôn luôn là một bước ngoặt lớn đối với tôi từ triết lý plyr.
.SD
). [nghiêm túc] Tôi nghĩ rằng đây là những khác biệt về thiết kế hợp pháp sẽ thu hút những người khác nhau
dplyr
một giải pháp là:as.data.table(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by = list(name, job)]