2011-12-14 4 views
21

Giả sử tôi có data.table và tôi muốn chọn tất cả các hàng có biến x có giá trị b. Điều đó thật dễ dàngLàm cách nào để chọn các hàng theo hai tiêu chí trong data.table trong R

library(data.table) 
DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
setkey(DT,x)    # set a 1-column key 
DT["b"] 

Nhân tiện, có vẻ như bạn phải đặt khóa, nếu khóa không được đặt thành x thì điều này không hoạt động. Bằng cách nào sẽ xảy ra nếu tôi đặt hai cột làm khóa?

Dù sao, di chuyển dọc theo, cho phép nói rằng tôi muốn chọn tất cả các hàng nơi biến x là a hoặc b

DT["b"|"a"] 

không hoạt động

Nhưng các công việc sau

DT[x=="a"|x=="b"] 

Nhưng điều đó sử dụng quét vector một khung dữ liệu la. Nó không sử dụng tìm kiếm nhị phân. Tôi đoán cho các tập dữ liệu nhỏ hơn nó sẽ không quan trọng.

Đó có phải là những gì tôi nên làm hoặc tôi không biết gì về cú pháp data.table?

Và một điều nữa. Có bất kỳ ví dụ nào về các thủ tục lựa chọn đa biến phức tạp hơn (hoặc tập con) với dữ liệu.

Tôi biết tôi luôn có thể hoàn nguyên về việc sử dụng hàm subset() kể từ khi dữ liệu có thể hoạt động như một data.frame nếu nó phải.

+2

Ví dụ chi tiết về khóa đa cột trong phần giới thiệu. –

+2

Và không chắc chắn làm thế nào nó được biết là làm việc thông qua kết quả của 'ví dụ (data.table)' tại dấu nhắc - ví dụ là có. –

Trả lời

13

Đây là cách mà tôi chỉ nghĩ ra sau khi tôi đặt câu hỏi và nó hoạt động nhưng tôi không biết làm thế nào trong tiêu chuẩn. Tôi hiện không ở một máy tính có cài đặt R. Tôi đoán tôi nên sử dụng một cá thể đám mây. Dù sao, tôi thích cú pháp

DT[c("a","b")] 
+1

Tôi đã thêm điều này vào điểm chuẩn dưới đây, nó thực hiện nhanh nhất cho đến nay trong ba giải pháp. Công việc tốt đẹp. – Chase

+1

Tuyệt vời. Điều đó được gọi là _by không có by_, a.k.a. _grouping bởi 'i'_. Hơi analagous để _having_ trong SQL. –

+3

Khi bạn bị treo nhóm bằng 'i', bước học tiếp theo là _join phạm vi thừa kế_. Chạy 'example (data.table)' và kết quả cho thấy một ví dụ. –

13

Sử dụng toán tử %in% dường như cung cấp cho một yếu tố của 2 va chạm hiệu suất. Xem xét:

library(data.table) 
library(rbenchmark) 
DT <- data.table(x=sample(letters, 1e6, TRUE), y=rnorm(1e6), v=runif(1e6)) 
setkey(DT,x)    # set a 1-column key 
DT["b"] 
f1 <- function() DT[x %in% letters[1:2]] 
f2 <- function() DT[x=="a"| x == "b"] 

> benchmark(f1(),f2()) 
    test replications elapsed relative user.self sys.self user.child sys.child 
1 f1()   100 8.40 1.000000  7.58  0.81   NA  NA 
2 f2()   100 17.11 2.036905  15.54  1.56   NA  NA 

> all.equal(f1(), f2()) 
[1] TRUE 

EDIT: Thêm tùy chọn Farrel của

Lưu ý, đây là trên một máy tính khác nhau, nhưng những va đập tương đối đều giống nhau.

f3 <- function() DT[c("a", "b")] 

    test replications elapsed relative user.self sys.self user.child sys.child 
1 f1()   100 11.281 7.121843  9.745 1.323   0   0 
2 f2()   100 23.106 14.587121 20.824 2.224   0   0 
3 f3()   100 1.584 1.000000  1.042 0.541   0   0