4

私は次のものを持っていdata.tableますR

  library(data.table)
  DT = data.table(x=rep(c("b","a","c"),each=3), y=sample(rnorm(9)), v=1:9)

x列ごとに最小値と最大値を計算し、これら 2 つの新しい列を に追加したいだけですDT。これが私の行です:

  DT[,c("e","d"):= list(min(y),max(y)), with=FALSE, by = x] 
  Error in `[.data.table`(DT, , `:=`(c("e", "d"), list(min(y), max(y))),  : 
  'with' must be TRUE when 'by' or 'keyby' is provided

それでも、: と書くと、次のようDT[,c("e","d"):= list(min(y),max(y)), with=FALSE]になります。

     x       y    v     e       d
  1: a -1.7125000 4 -1.7125 1.30553
  2: a  1.0198038 5 -1.7125 1.30553
  3: a  1.3055301 6 -1.7125 1.30553
  4: b -0.9238759 1 -1.7125 1.30553
  5: b  0.3077016 2 -1.7125 1.30553
  6: b -1.2580845 3 -1.7125 1.30553
  7: c -0.9399120 7 -1.7125 1.30553
  8: c -0.1910583 8 -1.7125 1.30553
  9: c  0.1239158 9 -1.7125 1.30553

ご覧のとおり、これは機能していますが、 によってタスクを実行していませんx。似たようなものを取得したいのですが、変数の各値によって計算edれるはずですx。だから、私の質問は次のとおりです。どうすればこれを解決できますか?

4

2 に答える 2

4

" :=by group" (バージョン 1.8.2 の新機能) と " :=with multiple new columns" (バージョン 1.7.8 の新機能) はどちらも比較的最近data.tableに追加されたものです。

" :=by group with multiple new columns " は (まだ) 実装されていません。

したがって、今のところ、これを行うことができます(ワンライナーが必要な場合):

setkey(DT, "x")
DT <- DT[DT[,list(e=min(y), d=max(y)), by=key(DT)]]

またはこれ(余分なコピー操作を最小限に抑えたい場合):

setkey(DT, "x")
DT[,e:=min(y), by=key(DT)]
DT[,d:=max(y), by=key(DT)]
于 2012-09-10T18:14:11.690 に答える
3

これが構文です。それが機能するためのキーとしてDT持つ必要があります。x

DT = data.table(x=rep(c("b","a","c"),each=3), y=sample(rnorm(9)), v=1:9)
setkey(DT, x)
DT[DT[, list(e=min(y), d=max(y)), by=x]]

   x           y v           e         d
1: a  0.04583602 4 -0.08423764 0.5778324
2: a  0.57783240 5 -0.08423764 0.5778324
3: a -0.08423764 6 -0.08423764 0.5778324
4: b -1.30934873 1 -1.30934873 0.3071819
5: b -0.05972203 2 -1.30934873 0.3071819
6: b  0.30718188 3 -1.30934873 0.3071819
7: c -0.72347616 7 -0.72347616 0.7800817
8: c -0.46930825 8 -0.72347616 0.7800817
9: c  0.78008168 9 -0.72347616 0.7800817
于 2012-09-10T18:04:18.873 に答える