2013-02-23 5 views
7

data.tableにbyというキーワードを使用してグループ化すると、常にbyカラムが最初のカラムとして返されます。これをしないように指示するフラグ/オプションはありますか?またはそれを取り除く賢い方法?data.tableグループ化の最初の列として `by`カラムを返さない方法はありますか

私は問題をInfactは、私のオリジナルのテーブルにグループ化すると、その後 rbindlist特に

はまた、言うことができた - 例えば

を「列を並べ替え、それを停止する方法」:

DT = data.table(I = as.numeric(1:6), N = rnorm(6), L = rep(c("a", "b", "c"), 2)) 
DT[, list(I = mean(I), N = mean(N)), by= L] 
DT 

は与える:

> DT[, list(I = mean(I), N = mean(N)), by= L] 
    L I   N 
1: a 2.5 0.4291802 
2: b 3.5 0.6669517 
3: c 4.5 -0.6471886 
> DT 
    I   N L 
1: 1 1.8460998 a 
2: 2 0.7093438 b 
3: 3 -1.7991193 c 
4: 4 -0.9877394 a 
5: 5 0.6245596 b 
6: 6 0.5047421 c 

限りrbindlist要求が行くように、これを行うことができるようにいいだろう。

DT = rbindlist(list(DT, DT[, list(I = mean(I), N = mean(N)), by= L])) 

または多分

DT = rbindlist(list(DT, DT[, list(I = mean(I), N = mean(N), L), by= L])) 

または類似した何か(どちらの仕事)

+2

(+1)同じ列でも同じ順序で返されます。 – Arun

+3

Carone、@Arun、ok +1が[FR#1757](https://r-forge.r-project.org/tracker/?group_id=240&atid=978&func=detail&aid=1757)に追加されました。 –

+1

@MatthewDowle、この機能をToDoリストに追加していただきありがとうございます。 – Arun

答えて

4

私も特にこの自動列の並べ替えが好きではありません。 DTの名前が同じであれば、この作品もちろん

setcolorder(DT.out, names(DT)) 

#  I   N L 
# 1: 2.5 0.772719306 a 
# 2: 3.5 -0.008921738 b 
# 3: 4.5 -0.770807996 c 

:として

ここ
DT <- data.table(I = 1:6, N = rnorm(6), L = rep(c("a", "b", "c"), 2)) 
DT.out <- DT[, list(I = mean(I), N = mean(N)), by= L] 

setcolorderを:「トリック」私は通常行うには、次のように出力を得た後setcolorderを使用することですDT.out。そうでなければ、あなたは明示的に列の順序を指定する必要がありますよう:

setcolorder(DT.out, c("I", "N", "L")) 

編集:あなたはすぐに行によってそれらをバインドしたいと思いますので、はい、中間体としてこれを持っていないためにいいだろう結果。 rbindlistは位置によってバインドされているようだから、カラム名でバインドするrbindを使用し、data.tableはこれを警告として通知し、代わりに位置でバインドする場合はuse.names=Fを使用するように指示します。この警告は無視しても問題ありません。

dt1 <- data.table(x=1:5, y=6:10) 
dt2 <- data.table(y=1:5, x=6:10) 

rbind(dt1, dt2) # or do.call(rbind, list(dt1, dt2)) 

#  x y 
# 1: 1 6 
# 2: 2 7 
# 3: 3 8 
# 4: 4 9 
# 5: 5 10 
# 6: 6 1 
# 7: 7 2 
# 8: 8 3 
# 9: 9 4 
# 10: 10 5 
# Warning message: 
# In .rbind.data.table(...) : 
# Argument 2 has names in a different order. Columns will be bound by name for 
# consistency with base. Alternatively, you can drop names (by using an unnamed 
# list) and the columns will then be joined by position. Or, set use.names=FALSE. 
+0

+1しかし、私はそれを考えていましたが、直ちにrbindリストを実行したいので、列を並べ替えるだけで中間体を保存する必要がないのがいいでしょう。(これを質問に追加して、 – Corone

+0

'rbind'は自動的に列の並べ替えを処理すると思いますか? – Arun

+0

' rbindlist'のように見えますが、 'data.frames'の' rbind'とは異なる位置にバインドする列名を削除します。 – Arun