2012-12-01 185 views
6

我有一個data.table X矢量搜索,我想基於2個字符變量如何避免data.table

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

此代碼創建一個變量,但它是非常緩慢的,因爲它矢量掃描2個字符變量。請注意,我不會通過VarA和VarB設置key4表。在data.table中有沒有「正確」的方法來做到這一點?

更新1:我不使用setkey進行此轉換,因爲我已經使用setkey(X,Year,ID)來進行其他變量轉換。如果我這樣做,我需要在此轉換後將密鑰重置回Year,ID。

更新2:我做基準我的做法與馬修的做法,他的速度要快得多:

  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 

唯一的小東西是setkey的然後重新setkey的又有點冗長:)

+1

爲什麼你不設置密鑰? –

+0

那裏可能還有一些不必要的編碼;例如,如果VarA ==「AB」爲TRUE,那麼它也將始終爲真,即!is.na(VarA),對嗎? –

+0

嗨馬克,!is.na是必需的。否則,如果VarA缺失,那麼條件VarA ==「AB」將返回NA而不是0,因爲我想 – AdamNYC

回答

6

如何約:

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

,或者在一個線(以保存可變X的重複,並表明):

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

爲了避免設置鍵,按要求,怎麼樣手動輔助鍵

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] 

現在清楚了,這種語法是醜陋的。所以FR#1007 Build in secondary keys是建立到語法;例如,

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

在此期間它是可能的,只是手動,如上所示。

+0

您好馬修,請參閱我的更新,以避免在此避免setkey。但可能是setkey然後重置鍵仍然比矢量搜索:) :) – AdamNYC

+0

好吧,我看到,然後另一個選項是次要鍵。將編輯... –

+0

非常感謝,馬特。我今天學到了很多新東西。 set2key會很可愛。就目前而言,在我看來,設置和重置按鍵,儘管在代碼中增加了兩行,但更易於閱讀。它沒有創建另一個(小)數據集(即在您的示例中爲S)。 – AdamNYC