web-dev-qa-db-ja.com

データフレーム内の行のパーセンテージをランダムにサンプリングします

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%をランダムにサンプリングするにはどうすればよいですか。

17
ATMathew

これはどう:

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

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

14
Ben

dplyrパッケージでsample_frac()関数を使用できます。

例えば各グループ内で20%をサンプリングする場合:

mydf %>% sample_frac(.2)

各性別グループ内で20%をサンプリングする場合:

mydf %>% group_by(gender) %>% sample_frac(.2)
15
Zhen Liang

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

この関数は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",]))
2
Paul Hiemstra