7

R の data.table パッケージは、次のオプションを提供します。

'TRUE' は、'i' が一致する 'x' の整数の行番号を返します。

jただし、 を使用して確立されたグループ内の 'x' の整数行番号を内で取得する方法がわかりませんby

たとえば、与えられた...

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6))

...y の各値の DT へのインデックスを知りたいです。

私にとっての価値は、data.table の効率的に計算されたグループ化に基づいてグループごとの計算を実行する予定の別のデータ構造 (ADS) と並行して data.table を使用していることです。

たとえば、ADS が DT の各行の値を持つベクトルであるとします。

ADS<-sample(100,nrow(DT))

回避策として、最初に新しいシーケンス列を data.table に追加すると、グループの DT$y によって決定される ADS のグループごとの平均を計算できます。

DT[,seqNum:=seq_len(nrow(DT))]
DT[,mean(ADS[seqNum]),by=y]

これにより、新しい列を追加する代わりに、必要な結果が得られます。

この例では、tapply を使用して同じ答えを得ることができます。

tapply(ADS,DT$y,mean)

ただし、data.tables の効率的なグループ化によるパフォーマンス上の利点は得られません (特に「by」列にインデックスが付けられている場合)。

おそらく、私が見落としているいくつかの構文がありますか???

おそらく、これは data.table に簡単に追加できる機能なので、リクエストする必要があります (ウィンク、ウィンク)???

提案された構文: オプションで '.which' をグループ インデックスに設定し、次のように記述できるようにします。

DT[,mean(ADS[.which]),by=y,which=TRUE]
4

2 に答える 2

12

data.table1.8.3以降で利用可能で、の で使用.Iして、グループごとに行インデックスを取得できます...jdata.table

DT[ , list( yidx = list(.I) ) , by = y ]
#   y  yidx
#1: 1 1,4,7
#2: 3 2,5,8
#3: 6 3,6,9
于 2014-06-14T14:41:43.283 に答える
6

キー付きの data.table は、グループが連続したブロックに格納されるように並べ替えられます。その場合、.Nグループごとのインデックス情報を抽出するために使用できます。

DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6))
setkey(DT, y)

ii <- DT[,.N, by=y]
ii[, start := cumsum(N) - N[1] + 1][,end := cumsum(N)][, N := NULL]
#    y start end
# 1: 1     1   3
# 2: 3     4   6
# 3: 6     7   9

(個人的には、おそらくあなたが提案したようなインデックス列を追加するだけseqNumです。もっと単純に思えますが、本当に限界を押し上げていない限り、パフォーマンスにあまり影響を与えないと思います。)

于 2012-09-13T18:44:14.967 に答える