Ответ 1
Как насчет этого:
mydf[ sample( which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ]
Где 0.2 - ваш 20%, а length(which(mydf$gender=='F'))
- общее количество строк с F
Связано с этим вопросом.
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% этих строк.
Как насчет этого:
mydf[ sample( which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ]
Где 0.2 - ваш 20%, а length(which(mydf$gender=='F'))
- общее количество строк с F
Вы можете использовать sample_frac()
функцию в пакете dplyr
.
например. Если вы хотите попробовать 20% в каждой группе:
mydf %>% sample_frac(.2)
Если вы хотите попробовать 20% в каждой гендерной группе:
mydf %>% group_by(gender) %>% sample_frac(.2)
Предупреждение о саморекламе. Я написал функцию, которая позволяет удобную стратифицированную выборку, и я включил опцию подмножества уровней из переменных группировки перед выборкой.
Функция называется 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")
Чтобы пробовать 20%, вы можете использовать это, чтобы получить размер выборки:
n = round(0.2 * nrow(mydf[mydf$gender == "F",]))