.EACHI
でdata.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
がどのように機能するかについて混乱しています。誰か説明してもらえますか?
これをリストに追加しました here 。そして、うまくいけば、計画どおりに配信できるようになります。
その理由は、_by=.EACHI
_が最近の機能(1.9.4以降)である可能性が最も高いためです。ただし、機能はありませんです。例で説明しましょう。 2つのdata.tables X
とY
があるとします:
_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つのキー列のみ)の各行について、X
でcountの一致を取得したいとします。 _data.table
_<1.9.4のバージョンでは、次のようにj
で_.N
_を指定するだけでこれを実行できます。
_# < 1.9.4
X[Y, .N]
# x N
# 1: 2 2
# 2: 6 1
_
この暗黙的にが行うことは、j
が存在する場合、X
(Y
の行に対応)の各一致結果で_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
_
これで両方の機能ができました。お役に立てれば。