2013-12-13 17 views
11

Tôi có một data.table mà tôi muốn lọc dựa trên một số tiêu chí bất bình đẳng:Lọc data.table sử dụng bất đẳng thức và tên cột biến

dt <- data.table(A=letters[1:3], B=2:4) 
dt 
# A B 
# 1: a 2 
# 2: b 3 
# 3: c 4 

dt[B>2] 
# A B 
# 1: b 3 
# 2: c 4 

Các công trình trên cũng như một giải pháp vector quét. Nhưng tôi không thể tìm ra cách kết hợp điều này với tên biến cho các cột:

mycol <- "B" 
dt[mycol > 2] 
# A B  // Nothing has changed 
# 1: a 2 
# 2: b 3 
# 3: c 4 

Làm cách nào để giải quyết vấn đề này? Tôi biết tôi có thể sử dụng tìm kiếm nhị phân bằng cách đặt các khóa bằng cách sử dụng setkeyv(dt, mycol) nhưng tôi không thể thấy cách thực hiện tìm kiếm nhị phân dựa trên một số tiêu chí bất bình đẳng.

+5

không 'get (mycol)' hoạt động? –

+0

@CarlWitthoft Có. Đó sẽ là chức năng tôi bị thiếu ... – MattLBeck

+0

Bạn có thể tiếp tục và đăng câu trả lời đó nếu bạn muốn. –

Trả lời

7

OK, sau đó, Sử dụng get(mycol) vì bạn muốn đối số là dt[ là nội dung của đối tượng "mycol". Tôi tin rằng dt[mycol ...] tìm kiếm một vật thể "mycol" trong chính đối tượng data.table, trong đó tất nhiên không có động vật như vậy.

+0

Điều này đã cứu tôi. Nhưng ngay cả khi bạn làm 'dt ['B'> 2]', bạn phải làm 'dt [get ('B')> 2]'. Loại gây phiền nhiễu/có vẻ như tham chiếu cột nên hoạt động như một chuỗi. – wordsforthewise

+0

@wordsforthewise Cảm ơn bạn đã sửa. Tôi phải thừa nhận tôi đã không xem xét vấn đề này trong 4 năm qua! –

4

Có chức năng accesor được cung cấp cho việc này. j được đánh giá trong khung của X, tức là data.table, trừ khi bạn chỉ định with = FALSE. Đây sẽ là cách thực hiện kinh điển.

dt[ , mycol , with = FALSE ] 
    B 
1: 2 
2: 3 
3: 4 

cột Return, so sánh logic, hàng tập hợp con ...

dt[ c(dt[ , mycol , with = FALSE ] > 2) ] 
+0

@Mattrition xem cập nhật. Tôi không thích 'get' bởi vì bạn có thể gặp phải một số hành vi bất ngờ đánh giá điều này trong một số môi trường gọi lồng nhau. Tôi sẽ chỉ ra rằng 'with = FALSE' sẽ được cung cấp vì một lý do. –

+1

Ok, câu trả lời của bạn bây giờ cung cấp một giải pháp thay thế khác, vì vậy cảm ơn bạn. Một phương án thứ ba mà tôi tìm thấy là 'dt [dt [[mycol]]> 2]'. – MattLBeck

+0

@Mattrition * * dường như rõ ràng nhất. Bạn nên trả lời câu hỏi của riêng bạn với câu hỏi đó. –

4

Một lựa chọn khác là sử dụng ]] để lấy B như một vector, và tập hợp con sử dụng này:

dt[dt[[mycol]] > 2] 
Các vấn đề liên quan