随机抽样数据框中的一定百分比的行

时间:2013-02-22 18:34:37

标签: r row subset random-sample

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%的这些行。

4 个答案:

答案 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",]))