3

キー付きの data.table があり、別の複数列キーxを使用してマージする必要があることに気付きました。

(i) のキーの設定とリセット、および (ii) のコピーを別のキーxで追跡することは避けたいです。xここにいくつかのサンプルデータと私の現在のアプローチがあります:

require(data.table)
options(datatable.verbose=TRUE)
set.seed(1)
n    <- 10
m    <- 2
samp <- function(n) sample(1:9,n,replace=T)
x    <- data.table(A = samp(n),B = samp(n),C = samp(n),key="A")
y    <- x[samp(m),list(B,C,D=samp(m))]

# this works:
x[,.SD,key="B,C"][y]
#    B C A D
# 1: 7 6 6 5
# 2: 9 4 6 2

そのアプローチは機能しますが、コメントを受け取ります

...j は名前付きリストです。とても非効率です…

名前付きリストは.SD. これを行うためのより良い、またはより標準的な方法はありますか?

keyを使用しても使用しkeybyなく.SDても効果がないようです。

key(x[,,keyby="B,C"]) # A
key(x[,,key="B,C"]) # A
4

1 に答える 1

3

バージョン 1.9.5では、引数が追加され、変更ログに次onの使用上の注意がありました。

data.tables は、新しいon引数を使用してキーを設定することなく結合できるようになりました。例:の列 'y' をの 'x'DT1[DT2, on=c(x = "y")]と結合します。両方のdata.tablesの列「y」で結合します。DT2DT1DT1[DT2, on="y"]

この場合、マージ列名は と で同じであるためxy機能x[y,on=c("B","C")]します。


歴史的な回答 (バージョン 1.8.11 前後) :バージョン 1.8.11 以降 では、事前に呼び出すことと同等[.data.tableの引数があります。それはまさにこの質問が探しているものではありませんが、データ全体をコピーせずにこれを達成する方法がわかりません(悪いimo)ので、これは合理的な妥協だと思いますが、そうでない場合はお知らせください。keysetkeyv

マシューから編集

key特にtoという名前の引数を追加する[.data.tableことは、ここ数日の新しい提案であり、まだ応答していません。set2keyたとえば、過去にセカンダリ キーについて説明しました。セカンダリ キーはデータをコピーしません。

keyリスト外で議論しますが、[.data.table名前が変更されるか、別の方法で行われる可能性が高いと思います. インターネットへのリマインダー: v1.8.11 は開発中であり、不安定で実験的です。CRAN に公開されると、信頼できるようになります。

于 2013-09-29T03:49:27.267 に答える