17

R(data.frameではなく)でdata.table(パッケージdata.tableから)をサブセット化しようとしています。キーとして4桁の年があります。一連の年を取ってサブセット化したいと思います。たとえば、1999 年、2000 年、2001 年のすべてのレコードを取得したいとします。

私はDT[J(year)]バイナリ検索構文に次を渡そうとしました:

1999,2000,2001
c(1999,2000,2001)
1999, 2000, 2001

しかし、これらのどれも機能していないようです。選択したい年が1年だけでなく複数年であるサブセットを行う方法を知っている人はいますか?

4

4 に答える 4

19

sで機能するものはdata.framesで機能しdata.tableます。

subset(DT, year %in% 1999:2001)
于 2011-03-30T16:41:48.917 に答える
16

質問は明確ではなく、使用するのに十分なデータを提供していませんが、有用なので、今後提供するデータで編集できる人がいれば大歓迎です。投稿のタイトルも完成させることができます: 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入力されていることを思い出してください。です。受け入れますが、それでもはるかに好みます。numeric2Lintegerdata.tablenumericinteger


数値の高速基数ソートは 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 
于 2013-03-08T16:15:00.127 に答える
8

上記と同様ですが、さらに data.table 風に:

DT[year %in% c(1999, 2000, 2001)]

于 2012-05-26T16:50:37.723 に答える