これはdata.table
v1.8.1 でより簡単になりました。:=
グループごとに動作するようになりました。グループは連続している必要はなく、元の順序が維持されます。そして、それはたった1行です:
library(data.table)
# set up data
set.seed(2)
npupils <- rpois(10, 20)
pupil <- unlist(lapply(npupils, seq_len))
school <- rep(seq_along(npupils), npupils)
dt <- data.table(school = school, pupil = pupil) # Create a data.table
dt <- dt[sample(seq_len(nrow(dt)))] # Mix it up
dt
school pupil
1: 5 2
2: 6 13
3: 2 14
4: 5 3
5: 10 14
---
186: 3 11
187: 7 2
188: 8 12
189: 3 6
190: 7 10
(dt[, schoolSize := .N, by = school])
school pupil schoolSize
1: 5 2 16
2: 6 13 18
3: 2 14 15
4: 5 3 16
5: 10 14 24
---
186: 3 11 14
187: 7 2 28
188: 8 12 19
189: 3 6 14
190: 7 10 28
これには、高速グループ化の通常の速度の利点がすべてあり、コピーなしで参照によって新しい列を割り当てます。
編集:バージョン1.8.1より前にのみ関連する回答を削除しましたdata.table
:(マシューの更新に感謝します)。