質問は明確ではなく、使用するのに十分なデータを提供していませんが、有用なので、今後提供するデータで編集できる人がいれば大歓迎です。投稿のタイトルも完成させることができます: Matthew Dowle はしばしば 2 つのベクトルに対するサブセット化の質問に答えますが、1 つのベクトルに対するステートメント内のサブセット化による質問にはそれほど頻繁ではありません。ここで文字ベクトルの答えが見つかるまで、答えを探していました。
このデータを考えてみましょう:
library(data.table)
n <- 100
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
に対応する data.table-style クエリX[X$a %in% c(10,20),]
は、なんとなく驚くべきものです。
setkey(X,a)
X[.(c(10,20))]
X[.(10,20)] # works for characters but not for integers
# instead, treats 10 as the filter
# and 20 as a new variable
# for comparison :
X[X$a %in% c(10,20),]
さて、どれが一番いいでしょうか?キーがすでに設定されている場合は、明らかに data.table です。そうでなければ、次の時間測定を証明するように、そうではないかもしれません(私の1,75 Go RAMコンピューターで):
n <- 1e7
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
system.time(X[X$a %in% c(10,20),])
# utilisateur système écoulé (yes, I'm French)
# 1.92 0.06 1.99
system.time(setkey(X,a))
# utilisateur système écoulé
# 34.91 0.05 35.23
system.time(X[J(c(10,20))])
# utilisateur système écoulé
# 0.15 0.08 0.23
しかし、おそらくマシューはより良い解決策を持っています...
[マシュー] ソート タイプnumeric
(別名double
) は よりもはるかに遅いことがわかりましinteger
た。double
ユーザーがこの罠に陥り、このようなひどいタイミングを報告することを恐れて、私たちは何年もの間、キーの入力を許可していませんでした。double
高速な並べ替えはまだ実装されていないため、いくつかの恐怖でキーを許可しましdouble
た. integer
カウントソートを使用して行われるため、高速ソートcharacter
は非常に優れています。うまくいけば、いつの日か高速ソートに到達するでしょうnumeric
! (現在実装されています - 以下を参照してください)。
1.9.0 より前の data.table のタイミング
n <- 1e7
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
system.time(setkey(X,a))
# user system elapsed
# 13.898 0.138 14.216
X <- data.table(a=sample(as.integer(c(10,20,25,30,40)),n,replace=TRUE),b=1:n)
system.time(setkey(X,a))
# user system elapsed
# 0.381 0.019 0.408
デフォルトでRに2
入力されていることを思い出してください。です。受け入れますが、それでもはるかに好みます。numeric
2L
integer
data.table
numeric
integer
数値の高速基数ソートは v1.9.0 以降で実装されています。
v1.9.0 以降
n <- 1e7
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
system.time(setkey(X,a))
# user system elapsed
# 0.832 0.026 0.871