3

各行が瞳孔に関する観察であるデータフレームがあります。データ フレーム内のベクトルの 1 つは、学校の ID です。次のように、各学校のカウントを持つ新しいベクトルを取得しました。

tbsch <- table(dt$school)

次に、関連するカウント値を の各行に追加しますdtfor()の各行をループしてdt、関連するカウントを含む新しいベクトルを作成し、最終的cbind()に に追加するために使用しましたdtが、これは非常に非効率的だと思います。それを行うスマート/簡単な方法はありますか?

4

4 に答える 4

8

あなたができるjmsignerのデータを使用して:

dt$count <- ave(dt$school, dt$school,  FUN = length)
于 2012-07-01T12:29:53.893 に答える
3

これはdata.tablev1.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:(マシューの更新に感謝します)。

于 2012-07-01T12:20:30.997 に答える
1

plyrを使用することもできます...そして、この 1 つのライナーを使用して元の順序を維持します

join(dt, count(dt, "school"))
于 2012-07-01T10:16:16.700 に答える