2012-12-01 33 views
6

Tôi có một X data.table mà tôi muốn tạo ra một biến dựa trên 2 biến nhân vậtLàm thế nào để tránh tìm kiếm vector trong data.table

X[, varC :=((VarA =="A" & !is.na(VarA)) 
       | (VarA == "AB" & VarB =="B" & !is.na(VarA) & !is.na(VarB)) 
       ) 
     ] 

Mã này hoạt động nhưng nó là rất chậm, bởi vì nó hiện vector quét trên 2 biến char. Lưu ý rằng tôi không đặt bảng claim4 của VarA và VarB. Có một cách "đúng" để làm điều này trong data.table?

Cập nhật 1: Tôi không sử dụng setkey cho phép chuyển đổi này vì tôi đã sử dụng setkey (X, Year, ID) cho các biến đổi biến khác. Nếu tôi làm như vậy, tôi cần đặt lại các khóa quay lại Năm, ID sau khi chuyển đổi này.

Cập nhật 2: Tôi đã chuẩn tiếp cận của tôi với cách tiếp cận của Matthew, và ông nhanh hơn nhiều:

  test replications elapsed relative user.self sys.self user.child sys.child 
2 Matthew    100 3.377 1.000  2.596 0.605   0   0 
1 vectorSearch   100 200.437 59.354 76.628 40.260   0   0 

Điều nhỏ chỉ được setkey sau đó tái setkey lại là hơi dài dòng :)

+1

Tại sao bạn không đặt khóa? –

+0

Cũng có thể có một số mã không cần thiết ở đó; ví dụ: nếu VarA == "AB" là TRUE, thì nó cũng sẽ luôn là TRUE mà! is.na (VarA), đúng không? –

+0

Xin chào Marc, is.na là bắt buộc. Nếu không, nếu VarA bị thiếu, thì điều kiện VarA == "AB" sẽ trả về NA thay vì 0 vì tôi muốn – AdamNYC

Trả lời

6

thế nào về:

setkey(X,VarA,VarB) 
X[,varC:=FALSE] 
X["A",varC:=TRUE] 
X[J("A","AB"),varC:=TRUE] 

hoặc, trong một dòng (để tiết kiệm lặp đi lặp lại của biến X và để chứng minh):

X[,varC:=FALSE]["A",varC:=TRUE][J("A","AB"),varC:=TRUE] 

Để tránh đặt khóa, theo yêu cầu, làm thế nào về một tay thứ quan trọng:

S = setkey(X[,list(VarA,VarB,i=seq_len(.N))],VarA,VarB) 
X[,varC:=FALSE] 
X[S["A",i][[2]],varC:=TRUE] 
X[S[J("A","AB"),i][[3]],varC:=TRUE] 

Bây giờ rõ ràng, cú pháp đó là xấu xí. Vì vậy, FR#1007 Build in secondary keys là xây dựng thành cú pháp; ví dụ:

set2key(X,varA,varB) 
X[...some way to specify which key to join to..., varC:=TRUE] 

Trong khi chờ đợi, có thể, theo cách thủ công, như được hiển thị ở trên.

+0

Hi Matthew, xin vui lòng xem cập nhật của tôi với lý do không để tránh setkey ở đây. Nhưng có thể là setkey sau đó reset key vẫn nhanh hơn tìm kiếm vector :) – AdamNYC

+0

Ok tôi hiểu rồi, một tùy chọn khác là các phím thứ cấp. Sẽ chỉnh sửa ... –

+0

Cảm ơn rất nhiều, Mat. Tôi học được nhiều điều mới mẻ ngày nay. set2key sẽ đáng yêu. Bây giờ, có vẻ như với tôi rằng thiết lập và đặt lại khóa, mặc dù thêm hai dòng nữa vào mã, dễ đọc hơn. Nó không tạo một tập dữ liệu (nhỏ) khác (ví dụ: S trong ví dụ của bạn). – AdamNYC

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