2013-02-24 30 views
6

Câu hỏi của tôi liên quan đến dữ liệu R. có thể với nhiều khóa. lấy ví dụ này:Kết hợp Tham gia với Không tham gia vào dữ liệu.table?

library(data.table) 
example(data.table) 
key(DT) 
[1] "x" "y" 

và cho rằng tôi muốn có một biến thể của "x không bằng b và y không bằng 3", như ở đây:

DT[!J("b",3)] 
    x y v v2 m 
1: a 1 42 NA 42 
2: a 3 42 NA 42 
3: a 6 42 NA 42 
4: b 1 4 84 5 
5: b 6 6 84 5 
6: c 1 7 NA 8 
7: c 3 8 NA 8 
8: c 6 9 NA 8 

Biến tôi muốn là "x EQUAL b và y KHÔNG bằng 3 ", như trong đây:

DT[J("b",!3)] 
Error in `[.data.table`(DT, J("b", !3)) : 
    typeof x.y (double) != typeof i.V2 (logical) 

Bất kỳ cơ hội nào để J() có thể phủ nhận một số phím? Cảm ơn!

+1

tôi thấy cú pháp sau một chút minh bạch hơn: 'DT [x == 'b' & y! = 3] ' –

+2

Xin chào @GaryWeissman, cú pháp của bạn ngụ ý quét vectơ. Điểm của data.table và tham gia hoạt động là để tránh chính xác những người, bằng cách sử dụng các phím. Nhưng tôi đoán bạn là đúng cho người dùng không data.table dễ hiểu hơn. –

+0

Tôi không nghĩ rằng hàm 'J' hỗ trợ các toán tử logic không đồng nhất giữa các đối số. Tôi tin rằng cú pháp trên vẫn còn nhanh hơn trong DT hơn trong DF. –

Trả lời

6

Đối phím composite bạn có thể sử dụng sau

DT[.("b")][!.(x, 3)] # x is the name of first column of key 

Nói chung, bạn có thể chuỗi lại với nhau vài [ ] [ ] để lọc xuống kết quả mà bạn cần.



Lưu ý rằng bạn cũng có thể dễ dàng sử dụng câu lệnh lô gíc trong i của data.table.
Các J() - hoặc bây giờ .() - cú pháp, chỉ đơn giản là một sự thuận tiện viết tắt.

Bạn có thể sử dụng hầu hết mọi thứ có thể đi trong mệnh đề if, với lợi thế là truy cập vào tên cột dưới dạng biến.

Trong ví dụ cụ thể của bạn, bạn sẽ sử dụng x=="b" & y != 3 lưu ý đơn &, chứ không phải &&.

DT[ x=="b" & y != 3] 

Bạn cũng có thể kết hợp quét vector với việc tìm kiếm nhị phân của data.table như sau

DT[.("b")][y != 3] 
+0

bingo! Cảm ơn một tấn! –

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