7

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

特に、グループ化し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]))

または類似のもの(どちらも機能しません)

4

1 に答える 1

4

この自動列並べ替えも特に好きではありません。私が通常行う「トリック」はsetcolorder、次のように出力を取得した後に使用することです。

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, names(DT))

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

もちろん、これはの名前DTがと同じ場合に機能しDT.outます。それ以外の場合は、列の順序を次のように明示的に指定する必要があります。

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

編集:すぐに行でバインドしたいので、はい、これを中間結果として使用しないと便利です。また、rbindlist位置でバインドするように見えるのでrbind、列名でバインドするwhichを使用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.
于 2013-02-23T11:00:27.643 に答える