web-dev-qa-db-ja.com

data.tableの.EACHI?

.EACHIdata.tableが正確に行うことに関するドキュメントを見つけることができないようです。私はそれをドキュメントで簡単に言及しています:

既知のグループのサブセットの集約は、それらのグループをiに渡し、by=.EACHIを設定する場合に特に効率的です。 iがdata.tableの場合、DT[i,j,by=.EACHI]jの各行が結合するDTのグループのiを評価します。このグループ化をiごとに呼び出します。

しかし、DTのコンテキストでの「グループ」とはどういう意味ですか? DTに設定されているキーによってグループが決定されていますか?グループは、すべての列をキーとして使用するすべての個別の行ですか?私はDT[i,j,by=my_grouping_variable]のようなものを実行する方法を完全に理解していますが、.EACHIがどのように機能するかについて混乱しています。誰か説明してもらえますか?

61
Alex

これをリストに追加しました here 。そして、うまくいけば、計画どおりに配信できるようになります。


その理由は、_by=.EACHI_が最近の機能(1.9.4以降)である可能性が最も高いためです。ただし、機能はありませんです。例で説明しましょう。 2つのdata.tables XYがあるとします:

_X = data.table(x = c(1,1,1,2,2,5,6), y = 1:7, key = "x")
Y = data.table(x = c(2,6), z = letters[2:1], key = "x")
_

_X[Y]_を実行することで参加できることを知っています。これはsubset操作に似ていますが、(整数/行名または論理値の代わりに)_data.tables_を使用します。 Yのキー列を使用して、Yの各行について、Xのキー列(Yの+列)で対応する一致する行を見つけて返します。

_X[Y]
#    x y z
# 1: 2 4 b
# 2: 2 5 b
# 3: 6 7 a
_

ここで、Yのキー列(ここでは1つのキー列のみ)の各行について、Xcountの一致を取得したいとします。 _data.table_<1.9.4のバージョンでは、次のようにjで_.N_を指定するだけでこれを実行できます。

_# < 1.9.4
X[Y, .N]
#    x N
# 1: 2 2
# 2: 6 1
_

この暗黙的にが行うことは、jが存在する場合、XYの行に対応)の各一致結果で_j-expression_を評価します。これは、by-without-byまたはimplicit-byと呼ばれていました。なぜなら、あたかも隠し者がいるかのようだからです。

問題は、これが常にby操作を実行することでした。したがって、結合後の行数を知りたい場合は、_X[Y][ .N]_(またはこの場合は単にnrow(X[Y]))を実行する必要があります。つまり、_by-without-by_が必要ない場合、同じ呼び出しでj式を使用することはできません。その結果、たとえばX[Y, list(z)]を実行した場合、_by-without-by_を使用してlist(z)を評価したため、少し遅くなりました。

さらに_data.table_ユーザーはこれをexplicitに要求しました-詳細については this および this を参照コンテキスト。

したがって、_by=.EACHI_が追加されました。今、私たちが行うとき:

_X[Y, .N]
# [1] 3
_

意図したとおりに動作します(混乱を避けます)。結合の結果の行数を返します。

そして、

_X[Y, .N, by=.EACHI]
_

jの各行の一致する行でY- expressionを評価します(ここでYのキー列の値に対応)。 _which=TRUE_を使用すると、これを見やすくなります。

_X[.(2), which=TRUE] # [1] 4 5
X[.(6), which=TRUE] # [1] 7
_

それぞれに対して_.N_を実行すると、2,1が得られます。

_X[Y, .N, by=.EACHI]
#    x N
# 1: 2 2
# 2: 6 1
_

これで両方の機能ができました。お役に立てれば。

103
Arun