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 ), ]

我怎样才能随机选择 20% 的带有“F”的行,而不是选择多行(在上述情况下为 3)?那么在带有“F”的五行中,我如何随机抽取其中 20% 的行。

4

4 回答 4

20

您可以使用包中sample_frac()的功能dplyr

例如,如果您想在每组中取样 20%:

mydf %>% sample_frac(.2)

如果您想在每个性别组中抽取 20% 的样本:

mydf %>% group_by(gender) %>% sample_frac(.2)
于 2017-04-07T03:31:21.173 回答
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

您可以指定多个组(例如,如果您的数据框包含一个“状态”变量,并且您想按您指定的“状态”和“性别”进行分组group = c("state", "gender"))。您还可以指定多个“选择”参数(例如,如果您只想要来自加利福尼亚州和德克萨斯州的女性受访者,并且您的“州”变量使用两个字母的州缩写,您可以指定select = list(gender = "F", state = c("CA", "TX")))。

该功能本身可以在这里找到,或者您可以使用“devtools”包下载并安装包(这使您可以方便地访问帮助页面和示例),install_github如下所示:

# 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 回答