与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”的五行,如何随机抽样20%的这些行。
答案 0 :(得分:13)
您可以在sample_frac()
包中使用dplyr
功能。
e.g。 如果您想在每组中抽样20%:
mydf %>% sample_frac(.2)
如果您想在每个性别组中抽样20%:
mydf %>% group_by(gender) %>% sample_frac(.2)
答案 1 :(得分:12)
这个怎么样:
mydf[ sample( which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ]
其中0.2是你的20%而length(which(mydf$gender=='F'))
是F
的总行数
答案 2 :(得分: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"))
)。
可以找到函数本身here,也可以使用“devtools”软件包中的install_github
下载并安装软件包(可以方便地访问帮助页面和示例),如下所示:
# install.packages("devtools")
library(devtools)
install_github("mrdwabmisc", "mrdwab")
答案 3 :(得分:2)
要样本20%,您可以使用它来获取样本大小:
n = round(0.2 * nrow(mydf[mydf$gender == "F",]))