繁体   English   中英

如何避免data.table中的矢量搜索

[英]How to avoid vector search in data.table

我有一个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再次有点冗长:)

怎么样 :

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构建二级密钥就是将其构建到语法中; 例如,

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

与此同时,只需手动操作即可,如上所示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM