データフレームの別のサブセットと等しいサンプルサイズで、グループごとにデータフレームのサブセットをサンプリングします

デイブM

これが私の架空のデータフレームです。

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の観測数と等しく設定する方法がわかりません。

答えは私がレビューした他の質問にあるのではないかと思いますが、それらは私が実装するには少し進んでいます。

助けてくれてありがとう。

anandthakker

ddplyうまく使用するための鍵は、次のことを理解することです。

  1. 元のデータフレームをグループごとに小さなデータフレームに分割します
  2. 次に、グループごとに、指定した関数を呼び出します。その関数の仕事は、そのデータフレームを新しいデータフレーム変換することです*。
  3. そして最後に、変換されたすべての小さなデータフレームをつなぎ合わせます。

それを念頭に置いて、これが(私が思うに)あなたの問題を解決するアプローチです。

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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ