Случайно пробовать процент строк в кадре данных

Связано с этим вопросом.

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 в приведенном выше случае), как я могу случайным образом выбрать 20% строк с "F"? Итак, из пяти строк с "F", как я произвольно выбираю 20% этих строк.

Ответ 1

Как насчет этого:

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

Где 0.2 - ваш 20%, а length(which(mydf$gender=='F')) - общее количество строк с F

Ответ 2

Вы можете использовать sample_frac() функцию в пакете dplyr.

например. Если вы хотите попробовать 20% в каждой группе:

mydf %>% sample_frac(.2)

Если вы хотите попробовать 20% в каждой гендерной группе:

mydf %>% group_by(gender) %>% sample_frac(.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" (например, если вы хотите, чтобы только женщины-респонденты из Калифорнии и Техаса, а ваша переменная "state" использовала аббревиатуры с двумя буквами, вы можете указать select = list(gender = "F", state = c("CA", "TX"))).

Сама функция может быть найдена здесь, или вы можете загрузить и установить пакет (который дает вам удобный доступ к страницам справки и примерам) используя install_github из пакета "devtools" следующим образом:

# install.packages("devtools")
library(devtools)
install_github("mrdwabmisc", "mrdwab")

Ответ 4

Чтобы пробовать 20%, вы можете использовать это, чтобы получить размер выборки:

n = round(0.2 * nrow(mydf[mydf$gender == "F",]))