this 質問に関連しています。
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%をランダムにサンプリングするにはどうすればよいですか。
これはどう:
_mydf[ sample( which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ]
_
ここで、0.2は20%で、length(which(mydf$gender=='F'))
はF
の行の総数です。
dplyr
パッケージでsample_frac()
関数を使用できます。
例えば各グループ内で20%をサンプリングする場合:
mydf %>% sample_frac(.2)
各性別グループ内で20%をサンプリングする場合:
mydf %>% group_by(gender) %>% sample_frac(.2)
自己宣伝アラート。便利な層化サンプリングを可能にする関数を作成し、サンプリング前にグループ化変数からレベルをサブセット化するオプションを含めました。
この関数は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"))
を指定できます)。
関数自体は ここ にあります。または、次のように「devtools」パッケージから_install_github
_を使用して、パッケージをダウンロードしてインストールできます(ヘルプページと例に簡単にアクセスできます)。 :
_# install.packages("devtools")
library(devtools)
install_github("mrdwabmisc", "mrdwab")
_
20%をサンプリングするには、これを使用してサンプルサイズを取得できます。
n = round(0.2 * nrow(mydf[mydf$gender == "F",]))