Как избежать векторного поиска в данных.таблица

у меня есть сведения.таблица X, в которой я хотел бы создать переменную на основе 2 символьных переменных

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

этот код работает, но он очень медленный, потому что он выполняет векторное сканирование по 2 переменным char. Обратите внимание, что я не устанавливаю таблицу claims4 VarA и VarB. Есть ли "правильный" способ сделать это в данных.стол?

Update 1: я не использую setkey для этого преобразования, потому что я уже использую setkey(X, Year, ID) для других преобразований переменных. Если я это сделаю, Мне нужно перезагрузить ключи назад в год, ID после этого преобразования.

Update 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, затем re-setkey снова несколько многословен:)

1 ответов


как насчет :

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]

в то же время, это возможно только вручную, как показано выше.