6

私はどのように機能するかに少し驚いていますdata.table

> library(data.table)
data.table 1.8.2  For help type: help("data.table")
> dt <- data.table(a=11:20, b=21:30, c=31:40, key="a")
> dt[list(12)]
    a  b  c
1: 12 22 32
> dt[list(12), b]
    a  b
1: 12 22
> dt[list(12)][,b]
[1] 22

私がやろうとしているのは、選択に一致する行の単一の列(または式)の値を取得することです。生の数値はキー値ではなく行番号を示すため、キーをリストとして渡す必要があることがわかります。したがって、上記の最初のものは私には明らかです。しかし、2番目と3番目のサブセット式が異なる結果を生成する理由は、私にはかなり混乱しているように思われます。3番目の結果を取得したいのですが、2番目の方法で記述できることを期待しています。

行と列のdata.tableを同時にサブセット化すると、計算結果だけでなくキー値も常に含まれるという正当な理由はありますか?上記のように二重サブセット化する以外に、単一の結果を取得するための構文的に短い方法はありますか?

R2.15.1でdata.table1.8.2を使用しています。私の例を再現できない場合は、要因を重要なものと見なす方がよいでしょう。

dt <- data.table(a=paste("a", 11:20, sep=""), b=21:30, c=31:40, key="a")
dt["a11", b]
4

2 に答える 2

7

この質問について:

行と列のdata.tableを同時にサブセット化すると、計算結果だけでなくキー値も常に含まれるという正当な理由はありますか?

(私にとっては十分な)理由は、Matthew Dowleがまだそのオプションを追加していないことだと思います(おそらく、「:= withby」などのはるかに便利な機能の作業を優先しているためです)。

ここでの私の回答に続くコメントで、マシューはそれが彼のTODOリストにあることを示しているようで、「[これ]は追加されdrop=TRUEたときに(速度の利点で)何をするか」と述べています。drop

それまでは、次のいずれかで作業が完了します。

dt[list(12)][,b]
# [1] 22
dt[list(12)][[2]]
# [1] 22
dt[dt[list(12), which=TRUE], b]
# [1] 22
于 2012-08-04T05:48:27.423 に答える
6

1つの可能性は、以下を使用することです。

dt[a == 12]

dt[a == 12, b]

これは期待どおりに機能しますが、バイナリ検索が妨げられ、代わりにシーケンシャル検索が必要になり(この動作を変更する計画はありますか??)、速度が低下する可能性があります。


2014年9月の更新:v1.9.3になりました

ニュースから:

DT[column==values]DTの場合にのキーを使用するように最適化されましたkey(DT)[1]=="column"。それ以外の場合は、セカンダリキー(別名インデックス)が自動的に追加されるため、次のキーDT[column==values]がはるかに高速になります。DT[column %in% values]同等です。つまり、両方==%in%ベクトル値を受け入れます。コードを変更する必要はありません。既存のコードは自動的に恩恵を受けるはずです。セカンダリキーはを使用して手動で追加し、を使用set2key()して存在を確認できますkey2()。これらの最適化と関数名/引数は実験的なものであり、でオフにすることができますoptions(datatable.auto.index=FALSE)

于 2012-08-03T12:39:38.860 に答える