これが私の架空のデータフレームです。
location<- as.factor(rep(c("town1","town2","town3","town4","town5"),100))
visited<- as.factor(rbinom(500,1,.4)) #'Yes or No' variable
variable<- rnorm(500,10,2)
id<- 1:500
DF<- data.frame(id,location,visited,variable)
場所ごとに0と1の数が等しい新しいデータフレームを作成したいと思います。これを実現するには、場所ごとに0のサンプルをランダムに取得します(1よりも0が多いため)。
グループごとにサンプリングするこのソリューションを見つけました。
library(plyr)
ddply(DF[DF$visited=="0",],.(location),function(x) x[sample(nrow(x),size=5),])
コードが実行されるようにsize引数に「5」を入力しましたが、「size」引数をDF $ visited == 1の観測数と等しく設定する方法がわかりません。
答えは私がレビューした他の質問にあるのではないかと思いますが、それらは私が実装するには少し進んでいます。
助けてくれてありがとう。
ddply
うまく使用するための鍵は、次のことを理解することです。
それを念頭に置いて、これが(私が思うに)あなたの問題を解決するアプローチです。
sampleFunction <- function(df) {
# Determine whether visited==1 or visited==0 is less common for this location,
# and use that count as our sample size.
n <- min(nrow(df[df$visited=="1",]), nrow(df[df$visited=="0",]))
# Sample n from the two groups (visited==0 and visited==1).
ddply(df, .(visited), function(x) x[sample(nrow(x), size=n),])
}
newDF <- ddply(DF,.(location),sampleFunction)
# Just a quick check to make sure we have the equal counts we were looking for.
ddply(newDF, .(location, visited), summarise, N=length(variable))
メインは場所ddply
ごとに分類DF
して適用するだけで、手間のsampleFunction
かかる作業を行います。
sampleFunction
(あなたの場合には、各位置に対して1つの)より小さなデータ・フレームのうちの1つ、サンプルそれから等しい数の取りvisited==1
とをvisited==0
。これはどのように行われますか?:への2回目の呼び出しで、ddply
今回はlocation
それを分解するために使用します。これにより、1と0の両方からサンプリングできます。
また、出現回数が少ないサブグループ(0または1)に基づいて各場所のサンプルサイズを計算しているため、このソリューションは、常に1よりも0が多いとは限らない場合でも機能します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加