2012-09-13 3 views
5

data.tableパッケージオプションを提供する:決定行インデックスRで

:「私は」に 一致することを「X」の整数の行番号を返す「TRUE」 。

ただし、Iはbyを使用して確立グループ内の「X」の整数行番号、j内、入手のない方法を見ません。例えば

、...

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

所与... Iは、Yの各値に対してDT内にインデックスを知りたいです。

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

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

Iは、回避策として、DT $ YグループIは、IFによって決定ADSのGroupWiseでの平均値を計算することができる:例えば

は、ADSを想定すると、DTの各行の値を有するベクトルであります最初に新しいシーケンス列をdata.tableに追加します。

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

これにより、新しい列を追加することができます。

私はこの例では、私はtapplyを使用して同じ答えを得ることができることを実現:

tapply(ADS,DT$y,mean) 

しかし、私は、(特にとき、列「で」data.tables効率的なグループ化のパフォーマンス上の利点を得ることはありませんインデックスされます)。

多分私は見落としているいくつかの構文がありますか?

おそらく、これはdata.tableに追加する簡単な機能であり、私はそれを要求する必要があります(ウインク、ウインク)???

提案構文:任意に設定「.which」グループインデックスに、書き込みを可能にする:グループが連続したブロックに格納されているように

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

私は私が従わないことを恐れている。 ADSとDTの間で実行したい計算の例を挙げられますか? –

+0

Blue、実際の例を示しました...私の最後のコード行は、DTのインデックスを使ってADSのグループワイズ平均を計算しています。私の_real_アプリケーションでは、ADSのデータ構造はベクトルではなく、 'GenomicRanges'オブジェクトであり、私のDTは範囲に関するメタデータです。いずれにしても、以下のジョシュとマシューは「事件」にある。ありがとう! – malcook

答えて

10

が利用可能data.table 1.8.3を使用すると、グループによって行インデックスを取得するためにdata.tablej.Iを使用することができますので、...

DT[ , list(yidx = list(.I)) , by = y ] 
# y yidx 
#1: 1 1,4,7 
#2: 3 2,5,8 
#3: 6 3,6,9 
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などのインデックス列を追加したい単純なようだ、私はそれを考えていませんあなたが本当に限界に挑戦されていない限り、あまりパフォーマンスに影響を及ぼします。)

+0

+10! OPが欲しいかもしれない.I?ウインクウインク。 –

+0

+11! (それは階乗ですか?)そして、そうです、OP(thats me)は本当に '.I'(または' which = TRUE')を望んでいます。それは実装のためのテーブルにありますか? – malcook

+0

@ josh-obrien、seqNumを追加するのは好きではありません。なぜなら、seqNum列はすでに使用されていないと仮定しています。変更したくないオブジェクトに破壊的な変更を加えます。どうも。 – malcook

関連する問題