20

この質問に関連しています。

gender <- c("F", "M", "M", "F", "F", "M", "F", "F")
age    <- c(23, 25, 27, 29, 31, 33, 35, 37)
mydf <- data.frame(gender, age) 

mydf[ sample( which(mydf$gender=='F'), 3 ), ]

行数 (上記の場合は 3) を選択する代わりに、「F」で行の 20% をランダムに選択するにはどうすればよいですか? 「F」の 5 つの行のうち、これらの行の 20% をランダムにサンプリングするにはどうすればよいでしょうか。

4

4 に答える 4

14

これはどう:

mydf[ sample( which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ]

0.2 は 20% でlength(which(mydf$gender=='F'))あり、行の総数です。F

于 2013-02-22T18:40:57.587 に答える
3

自己宣伝アラート。便利な層化サンプリングを可能にする関数を作成し、サンプリング前にグループ化変数からレベルをサブセット化するオプションを含めました。

この関数は呼び出さstratifiedれ、次のように使用できます。

set.seed(1)
# Proportional sample
stratified(mydf, group="gender", size=.2, select=list(gender = "F"))
#   gender age
# 4      F  29
# Fixed-size sampling
stratified(mydf, group="gender", size=2, select=list(gender = "F"))
#   gender age
# 4      F  29
# 5      F  31

複数のグループを指定できます(たとえば、データフレームに「state」変数が含まれていて、「state」と「gender」でグループ化する場合は、指定しますgroup = c("state", "gender"))。複数の「select」引数を指定することもできます(たとえば、カリフォルニアとテキサスの女性の回答者のみが必要で、「state」変数が2文字の州の略語を使用している場合は)を指定できますselect = list(gender = "F", state = c("CA", "TX"))

関数自体はここinstall_githubにあります。または、次のように「devtools」パッケージから使用して、パッケージをダウンロードしてインストールすることもできます(ヘルプページと例に簡単にアクセスできます) 。

# install.packages("devtools")
library(devtools)
install_github("mrdwabmisc", "mrdwab")
于 2013-02-25T07:46:00.020 に答える
2

20% をサンプリングするには、これを使用してサンプル サイズを取得できます。

n = round(0.2 * nrow(mydf[mydf$gender == "F",]))
于 2013-02-22T18:41:37.833 に答える