個人ごとに複数の観測があるときに年齢と性別を取得するときのように、データセットの最初の行のみを識別子でグループ化する必要がある場合があります。Rでこれを行うための高速(または最速)の方法は何ですか?下のaggregate()を使用しましたが、もっと良い方法があると思います。この質問を投稿する前に、Googleで少し検索し、ddplyを見つけて試しましたが、非常に遅く、データセット(400,000行×16列、7,000の一意のID)でメモリエラーが発生したことに驚きましたが、aggregate()バージョンかなり速かった。
(dx <- data.frame(ID = factor(c(1,1,2,2,3,3)), AGE = c(30,30,40,40,35,35), FEM = factor(c(1,1,0,0,1,1))))
# ID AGE FEM
# 1 30 1
# 1 30 1
# 2 40 0
# 2 40 0
# 3 35 1
# 3 35 1
ag <- data.frame(ID=levels(dx$ID))
ag <- merge(ag, aggregate(AGE ~ ID, data=dx, function(x) x[1]), "ID")
ag <- merge(ag, aggregate(FEM ~ ID, data=dx, function(x) x[1]), "ID")
ag
# ID AGE FEM
# 1 30 1
# 2 40 0
# 3 35 1
#same result:
library(plyr)
ddply(.data = dx, .var = c("ID"), .fun = function(x) x[1,])
更新:チェイスの答えとマットパーカーのコメントを参照してください。data.table
パッケージを使用する最速のソリューションについては、@ Matthew Dowleの回答を参照してください。
diff()
て、で最初のIDを取得できるようにすることですdx
。