私はr(sasから来ました)に比較的慣れていません。各グループ内で異なる数の観測を選択する必要があります。グループは 2 つの変数の値によって識別されます
ToSelect <- data.frame(
key1=c(1,1,1,1,1,2,2,2,2,2,2,2),
key2=c("a","a","b","b","b","a","a","a","a","b","b","b"),
var1=c(2,3,4,6,2,7,8,5,7,1,8,5)
)
NumObs <- data.frame(
key1=c(1,1,2,2),
key2=c("a","b","a","b"),
NumObs=c(1,2,2,1)
)
試してみました(質問「Rの各レベルで最初の80個の観測を選択してください」から)
ToSelect <- merge(x=ToSelect,y=NumObs,by=c("key1","key2"))
library(plyr)
Selected <- ddply(ToSelect, .(key1,key2), head, n = NumObs)
を与える
エラー: length(n) == 1L は TRUE ではありません
これはおそらく専門家にとって明らかなエラーです (na スカラー、NumObs はベクトル?)
同じ質問から、私は試しました:
Selected <- do.call(
rbind,
lapply(split(ToSelect, c(ToSelect$key1,ToSelect$key2)), head, NumObs)
)
を与える
エラー: length(n) == 1L は TRUE ではありません。さらに: 警告メッセージ: Split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...) : データ長が分割変数の倍数ではありません
それで、前と同じエラーに加えて、複数のもの、グループの長さが異なる場合、分割を使用できませんか?
次に、「グループごとの観測番号」という質問を見つけました。私の場合、rle /シーケンスの回答を機能させることができませんでしたが、ddplyの回答を適応させました。
ToSelect <- ddply(ToSelect, .(key1, key2), function(z){
cbind(var1=z$var1,NumObs=z$NumObs,
data.frame(
SeqNum = seq_along(z$key2)
)
)
}
)
Selected <- ToSelect[ToSelect$SeqNum<=ToSelect$NumObs,c("key1","key2","var1")]
動作します。
明らかに、私の実際のデータははるかに大きいので、代替のより良い方法はありますか? ありがとう!