2010-02-09 52 views
43

lưu ý: câu hỏi này và các câu trả lời sau đây đề cập đến các phiên bản data.table < 1.5.3; v. 1.5.3 đã được phát hành vào tháng 2 năm 2011 để giải quyết vấn đề này. thấy điều trị gần đây (03-2012): Translating SQL joins on foreign keys to R data.table syntaxCách thực hiện thao tác hợp nhất data.table


Tôi đã đào bới trong các tài liệu hướng dẫn cho data.table package (một sự thay thế cho data.frame đó là hiệu quả hơn cho các hoạt động nhất định), trong đó có Josh Reich's presentation on SQL and data.table at the NYC R Meetup (pdf), nhưng không thể hình dung hoạt động hoàn toàn tầm thường này.

> x <- DT(a=1:3, b=2:4, key='a') 
> x 
    a b 
[1,] 1 2 
[2,] 2 3 
[3,] 3 4 
> y <- DT(a=1:3, c=c('a','b','c'), key='a') 
> y 
    a c 
[1,] 1 a 
[2,] 2 b 
[3,] 3 c 
> x[y] 
    a b 
[1,] 1 2 
[2,] 2 3 
[3,] 3 4 
> merge(x,y) 
    a b c 
1 1 2 a 
2 2 3 b 
3 3 4 c 

Tài liệu nói "Khi [đối số đầu tiên] chính nó là dữ liệu.table, tham gia được gọi tương tự như base :: merge nhưng sử dụng tìm kiếm nhị phân trên khóa được sắp xếp". Rõ ràng nó không phải như thế. Tôi có thể lấy các cột khác từ y vào kết quả của x [y] với data.tables không? Có vẻ như nó chỉ lấy các hàng của x nơi khóa khớp với khóa của y, nhưng bỏ qua phần còn lại của y ...

+2

Điều này đã được giải quyết bởi v1.5.3 được phát hành cho CRAN vào tháng 2 năm 2011. Hãy xem đó là TIN TỨC, mới? Data.table và sửa chữa FAQ. –

Trả lời

27

Bạn đang trích dẫn phần sai của tài liệu. Nếu bạn có một cái nhìn tại doc của [.data.table bạn sẽ đọc:

Khi tôi là một data.table, x phải có một khóa , có nghĩa là tham gia i để x và trở các hàng trong x phù hợp. Một tham gia equi-join được thực hiện giữa mỗi cột trong i cho mỗi cột trong khóa x theo thứ tự. này tương tự như căn R chức năng của Subsetting một ma trận bởi một ma trận 2 cột, và trong chiều cao Subsetting một n-chiều mảng bởi một ma trận n-cột

Tôi thừa nhận các mô tả của gói (phần bạn trích dẫn) có phần khó hiểu, bởi vì có vẻ như nói rằng "[" -operation có thể được sử dụng thay vì hợp nhất. Nhưng tôi nghĩ rằng những gì nó nói là: nếu x và y là cả hai data.tables chúng tôi sử dụng một tham gia vào một chỉ số (được gọi là hợp nhất) thay vì tìm kiếm nhị phân. điều


Một hơn:

Thư viện data.table Tôi đã cài đặt qua install.packages được thiếu merge.data.table method, vì vậy sử dụng merge sẽ gọi merge.data.frame. Sau khi cài đặt package from R-Forge R, hãy sử dụng phương thức merge.data.table nhanh hơn.

Bạn có thể kiểm tra xem bạn có phương pháp merge.data.table bằng cách kiểm tra đầu ra của:

methods(generic.function="merge") 

EDIT [trả lời không còn giá trị]: Câu trả lời này đề cập đến data.table phiên bản 1.3. Trong phiên bản 1.5.3 hành vi của data.table thay đổi và x [y] trả về kết quả mong đợi. Cảm ơn bạn Matthew Dowle, tác giả của data.table, để chỉ ra điều này trong các ý kiến.

+0

Ah. Có vẻ như phiên bản trên CRAN là phiên bản 1.2, trong khi phiên bản trên R-Forge là phiên bản 1.3. Phương thức 'merge' đã được thêm vào trong 1.3. Từ những gì tôi có thể nói về việc tìm kiếm xung quanh R-Forge, phương pháp này đã được thêm vào một cái gì đó như 8 tháng trước, vì vậy tôi không biết tại sao nó không phải trên CRAN! – Harlan

+5

X [Y] cú pháp đã được thay đổi trong v1.5.3 phát hành cho CRAN vào tháng Hai năm 2011. Xin vui lòng xem đó là TIN TỨC, mới? Data.table và sửa chữa FAQ. –

3

Tôi nghĩ rằng f3lix là chính xác và tài liệu có chút ít gây hiểu lầm. Lợi ích là làm việc nhanh để tập hợp dữ liệu.Bạn vẫn cần sử dụng hàm merge sau đó như trong ví dụ trên.

Bạn sẽ thấy trong Josh's presentation on using data.table rằng đây là cách ví dụ của anh ấy chạy. Trước tiên, anh ta đặt một trong các data.tables, sau đó thực hiện hợp nhất:

library(data.table) 
sdt <- DT(series, key='series_id') 
ddt <- DT(data, key='series_id') 
u <- sdt[ grepl('^[A-Z]{2}URN', fred_id) & !grepl('DSURN', fred_id) ] 
d <- ddt[ u, DT(min=min(value)), by='series_id', mult='all'] 
data <- merge(d,series)[,c('title','min','mean','max')] 
+0

Cảm ơn, Shane. Tôi đã rất bối rối bởi điều này, như tôi biết (hoặc nghĩ rằng tôi biết) rằng 'hợp nhất' sẽ không tận dụng lợi thế của' data.table' lợi thế. – Harlan

14

Cảm ơn câu trả lời. Tôi đã bỏ lỡ chủ đề này khi nó được đăng lần đầu. data.table đã di chuyển kể từ tháng Hai. 1.4.1 đã được phát hành cho CRAN một thời gian trước và 1.5 sẽ sớm ra mắt. Ví dụ, biệt hiệu DT() đã được thay thế bằng danh sách(); như là một nguyên thủy nhanh hơn nhiều, và data.table bây giờ kế thừa từ data.frame để nó hoạt động với các gói chỉ chấp nhận data.frame như ggplot và lattice, mà không cần bất kỳ chuyển đổi nào (nhanh hơn và thuận tiện hơn).

Có thể đăng ký thẻ data.table để tôi nhận được email khi ai đó đăng câu hỏi bằng thẻ đó không? Danh sách datatable-help đã tăng lên khoảng 30-40 tin nhắn mỗi tháng, nhưng tôi cũng rất vui khi trả lời ở đây nếu tôi có thể nhận được một số thông báo.

Matthew

+1

Xin chào, cảm ơn bạn đã lưu ý! Vâng, chắc chắn là có thể. Nhấp vào hộp thẻ 'data.table' ở góc trên bên phải của màn hình, sau đó cuộn xuống cuối cho đến khi bạn thấy biểu tượng RSS và sử dụng để đăng ký các câu hỏi với thẻ này. – Harlan

+0

Cảm ơn Harlan. Tôi đã đăng ký ngay bây giờ. –

9

Tôi nghĩ rằng bằng cách sử dụng base::merge chức năng không cần thiết, như sử dụng data.table tham gia có thể nhanh hơn rất nhiều. Ví dụ. xem như sau. Tôi làm xy data.tables với 3-3 cột:

> x <- data.table(foo = 1:5, a=20:24, zoo = 5:1) 
> y <- data.table(foo = 1:5, b=30:34, boo = 10:14) 
> setkey(x, foo) 
> setkey(y, foo) 

Và kết hợp cả với base:mergedata.table tham gia để xem tốc độ của hành:

> system.time(merge(x,y)) 
    user system elapsed 
    0.027 0.000 0.023 
> system.time(x[,list(y,x)]) 
    user system elapsed 
    0.003 0.000 0.006 

Kết quả là không giống nhau, như cột thứ hai có thêm một cột:

> merge(x,y) 
    foo a zoo b boo 
[1,] 1 20 5 30 10 
[2,] 2 21 4 31 11 
[3,] 3 22 3 32 12 
[4,] 4 23 2 33 13 
[5,] 5 24 1 34 14 
> x[,list(x,y)] 
    foo a zoo foo.1 b boo 
[1,] 1 20 5  1 30 10 
[2,] 2 21 4  2 31 11 
[3,] 3 22 3  3 32 12 
[4,] 4 23 2  4 33 13 
[5,] 5 24 1  5 34 14 

Không thể gây ra rắc rối lớn :)

+3

Cảm ơn, điều đó thật thú vị. Một cú pháp hoàn toàn không rõ ràng, mặc dù! Nếu tôi sử dụng nó, tôi có thể xác định lại một hàm có chức năng '(x, y) x [, danh sách (x, y)]' hoặc một cái gì đó, có lẽ bỏ thêm cột khóa quá ... – Harlan

+2

Tôi nghĩ rằng cú pháp cho các phép nối trong data.table thực sự là x [y] hoặc x [y,], tức là các phép nối sẽ sử dụng chỉ mục đầu tiên. Điều này cho kết quả tương tự như hợp nhất. lưu ý rằng x [y] và y [x] không cần phải giống hệt nhau, tức là nếu y chứa các mục nhập trong foo không đại diện cho x. Có lẽ tôi đã bỏ lỡ một số, nhưng xem Tham gia trong data.table [họa tiết] (http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf) – cboettig

+1

ở trên x [, danh sách (x, y)] không hoạt động đối với tôi. Tôi đã thử x [, c (x, y)] và nó đã hoạt động. Tôi không chắc chắn nếu nó có ý nghĩa mặc dù. – bala

Các vấn đề liên quan