6

我有一个 data.table X 我想创建一个基于 2 个字符变量的变量

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

此代码有效,但速度很慢,因为它对 2 个字符变量进行矢量扫描。请注意,我没有按 VarA 和 VarB 设置密钥 claim4 表。在 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 然后再次 re-setkey 有点冗长:)

4

1 回答 1

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]

与此同时,也可以手动操作,如上图所示。

于 2012-12-01T14:38:41.333 回答