我有一个data.table X,我想根据2个字符变量
创建一个变量 X[, varC :=((VarA =="A" & !is.na(VarA))
| (VarA == "AB" & VarB =="B" & !is.na(VarA) & !is.na(VarB))
)
]
此代码有效,但速度很慢,因为它对2个char变量进行矢量扫描。请注意,我没有通过VarA和VarB setkey claim4 table。在data.table中有没有“正确”的方法呢?
更新1:我没有使用setkey进行此转换,因为我已经使用setkey(X,Year,ID)进行其他变量转换。如果我这样做,我需要在转换后将密钥重置为Year,ID。
更新2:我用Matthew的方法对我的方法进行了基准测试,他的速度要快得多:
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有点冗长:)
答案 0 :(得分: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]
与此同时,只需手动操作即可,如上所示。