10

私はこれが他のパッケージで達成できることを知っていますが、私はそれをやろうとしていますdata.table(グループ化するのに最も速いようです)。

library(data.table)
dt = data.table(a=c(1,2,2,3))
dt[,length(a),by=a]

結果は

   a V1
1: 1  1
2: 2  1
3: 3  1

一方

df = data.frame(a=c(1,2,2,3))
ddply(df,.(a),summarise,V1=length(a))

を生成します

  a V1
1 1  1
2 2  2
3 3  1

これはより賢明な結果です。なぜdata.table同じ結果が得られないのか、そしてこれをどのように達成できるのか疑問に思っています。

4

1 に答える 1

21

これを行うdata.tableの方法は.N、現在のグループの行数を追跡する特別な変数、を使用することです。(他の特別な変数には.SD、、.BY(バージョン1.8.2)および.I.GRPバージョン1.8.3から利用可能)が含まれます。すべては?data.table)に記載されています。

library(data.table)
dt = data.table(a=c(1,2,2,3))

dt[, .N, by = a]
#    a N
# 1: 1 1
# 2: 2 2
# 3: 3 1

試したことが機能しなかった理由を確認するには、次のコマンドを実行して、各ブラウザプロンプトでの値aを確認します。length(a)

dt[, browser(), by = a]
于 2012-11-02T13:48:03.280 に答える