2011-01-21 33 views
13

CẬP NHẬT: Cũ câu hỏi ... nó đã được giải quyết bởi v1.5.3 data.table trong Tháng Hai 2011.R: Khi sử dụng dữ liệu.tôi làm cách nào để nhận các cột y khi tôi thực hiện x [y]?

Tôi cố gắng để sử dụng gói data.table, và thực sự thích speedups Tôi nhận được, nhưng tôi đang bối rối bởi lỗi này khi tôi làm x[y, <expr>] nơi xy là "dữ liệu bảng" với chìa khóa giống nhau, và <expr> chứa tên cột của cả hai xy:

require(data.table) 
x <- data.table(foo = 1:5, a = 5:1) 
y <- data.table(foo = 1:5, boo = 10:14) 
setkey(x, foo) 
setkey(y, foo) 
> x[y, foo*boo] 
Error in eval(expr, envir, enclos) : object 'boo' not found 

upda TE ... Để làm rõ các chức năng Tôi đang tìm kiếm trong ví dụ trên: Tôi cần phải làm như tương đương với các nội dung sau:

with(merge(x,y), foo*boo) 

Tuy nhiên theo trích dưới đây từ data.table FAQ, điều này nên đã làm việc :

Cuối cùng, mặc dù nó có vẻ như thể x [y] không trả lại các cột trong y, bạn có thể thực sự sử dụng các cột từ y trong biểu thức j. Đây là những gì chúng tôi có nghĩa là bằng cách tham gia phạm vi được kế thừa. Tại sao không chỉ cần trả lại liên minh của tất cả các cột từ x và y và sau đó chạy các biểu thức trên đó? Nó tóm tắt thành tính hiệu quả của mã và nhanh hơn cho chương trình. Khi bạn viết x [y, foo boo], dữ liệu. Có thể tự động kiểm tra biểu thức j để xem những cột nào sử dụng. . Nó sẽ chỉ tập hợp con, hoặc nhóm, chỉ những cột đó. Bộ nhớ chỉ được tạo cho các cột sử dụng j . Giả sử foo nằm trong x và boo nằm trong y (cùng với 20 cột khác trong y). Không phải là x [y, foo boo] nhanh hơn để chương trình và nhanh hơn để chạy hơn một bước hợp nhất tiếp theo là một tập hợp con khác là bước?

Tôi biết this question đã giải quyết được vấn đề tương tự nhưng dường như không được giải quyết thỏa đáng. Bất cứ ai biết những gì tôi đang thiếu hoặc hiểu lầm? Cảm ơn.

CẬP NHẬT: Tôi đã yêu cầu danh sách gửi thư trợ giúp bảng dữ liệu và tác giả gói (Matthew Dowle) replied thực sự Câu hỏi thường gặp ở trên là sai, vì vậy cú pháp tôi đang sử dụng sẽ không hoạt động các cột y trong đối số j (tức là thứ hai) khi tôi thực hiện x[y,...].

+0

Nhưng bạn đã hỏi một số thời gian trước đây và nó đã được giải quyết bởi v1.5.3 phát hành cho CRAN vào tháng Hai năm 2011. Hãy xem đó là TIN TỨC, mới? Data.table và sửa chữa FAQ. –

+0

@Matthew cảm ơn bạn, vâng tôi biết nó đã được giải quyết bằng bản phát hành mới nhất, và tôi vui vì bạn đã chỉ ra nó ở đây để nó rõ ràng cho người khác. –

Trả lời

4

Tôi không chắc liệu mình có hiểu rõ vấn đề hay không và tôi cũng mới bắt đầu đọc tài liệu của dữ liệu.bảng thư viện, nhưng tôi nghĩ nếu bạn muốn để có được các cột của y và cũng làm điều gì đó cho những người bởi các cột của một, bạn có thể thử một cái gì đó như:

> x[y,a*y] 
    foo boo 
[1,] 5 50 
[2,] 8 44 
[3,] 9 36 
[4,] 8 26 
[5,] 5 14 

Ở đây, bạn sẽ có được quay lại các cột của y nhân với số một cột của x. Nếu bạn muốn nhận được x 's foo nhân y' s boo, hãy thử:

> y[,x*boo] 
    foo a 
[1,] 10 50 
[2,] 22 44 
[3,] 36 36 
[4,] 52 26 
[5,] 70 14 

Sau khi chỉnh sửa: cảm ơn bạn @Prasad Chalasani làm cho câu hỏi rõ ràng hơn cho tôi.

Nếu việc hợp nhất đơn giản được ưu tiên thì các thao tác sau sẽ hoạt động. Tôi đã tạo một dữ liệu phức tạp hơn để xem các hành động sâu hơn:

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ì vậy, chỉ thêm một cột bổ sung vào mỗi dữ liệu. Chúng ta hãy xem merge và làm nó với data.tables:

> 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 

Từ đó sau này trông rất nhanh. Kết quả là không giống nhau mặc dù, nhưng có thể được sử dụng theo cách tương tự (với một cột thêm thời gian sau):

> 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 

Vì vậy, để có được xy chúng ta có thể sử dụng: xy <- x[,list(x,y)]. Để tính toán một cột data.table từ xy$foo * xy$boo, sau đây có thể làm việc:

> xy[,foo*boo] 
[1] 10 22 36 52 70 

Vâng, kết quả không phải là một data.table nhưng một vector để thay thế.


Cập nhật (29/03/2012): nhờ cho @ David đã chỉ chú ý của tôi đến một thực tế rằng merge.data.table được sử dụng trong các ví dụ trên.

+0

Đề cập đến ví dụ trong câu hỏi của tôi, tôi muốn tham gia 'x' và' y', hãy gọi nó là 'xy', và sau đó tạo một khung dữ liệu một cột bằng với' xy $ foo * xy $ boo'. –

+0

@Prasad Chalasani: Tôi đã chỉnh sửa câu trả lời của mình, tôi hy vọng bạn có thể tìm thấy một cái gì đó mới và có giá trị trong đó. – daroczig

+0

cảm ơn cho các chi tiết, nhưng câu hỏi của tôi là về lý do tại sao cú pháp cụ thể tôi mô tả trong câu hỏi của tôi là không làm việc, trái với những gì nó nói trong FAQ. Tôi biết rằng tôi có thể làm điều đó trong hai giai đoạn (hợp nhất, sau đó hoạt động trên các cột), nhưng tôi muốn cú pháp 'x [y, ]' hoạt động * trong một bước * - nghĩa là thực hiện phép nối và hoạt động trên ' x' và 'y' cột trong một bước. Đây là cú pháp ít tẻ nhạt và có thể nhanh hơn (nếu được thực hiện ngay trong nội bộ). Tôi đang xử lý 10 triệu khung dữ liệu hàng, vì vậy tôi không quan tâm đến thời gian của ví dụ đồ chơi nhỏ ở trên. –

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