我有一個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的又有點冗長:)
爲什麼你不設置密鑰? –
那裏可能還有一些不必要的編碼;例如,如果VarA ==「AB」爲TRUE,那麼它也將始終爲真,即!is.na(VarA),對嗎? –
嗨馬克,!is.na是必需的。否則,如果VarA缺失,那麼條件VarA ==「AB」將返回NA而不是0,因爲我想 – AdamNYC