具有多个条件的行 "with at least x of each group" 的随机样本

random sample of rows "with at least x of each group" with several conditions

我有一个包含 150 个观察值的样本。我想根据三个条件随机 select 24 行(个人)。数据来自三个不同的地区,有两种可能的性别和 6 个可能的年龄组。所以每个样本应该有来自每个地区每个年龄组的一男一女。

问题 1a: 我有代码 select 基于一个条件(例如,下面从每个年龄组中选择 2 个)但是我如何将它扩展到所有我在上面指定的其他选项?

问题 1b: 那么,如何保存每个样本的 ID?

#create data
set.seed(1)

mydf <- data.frame(ID = rep(1:150), age = rep(1:6), region = rep(1:3), gender = rep(1:2))
rankings <- data.frame(matrix(rnorm(45), ncol=150))
colnames(rankings) <- mydf$ID               #rename columns with id because each column in rankings is a person


#Sample conditionally
sample_each <- function(data, var, n = 1L) {
  lvl <- table(data[, var])
  n1 <- setNames(rep_len(n, length(lvl)), names(lvl))
  n0 <- lvl - n1
  idx <- ave(as.character(data[, var]), data[, var], FUN = function(x)
    sample(rep(0:1, c(n0[x[1]], n1[x[1]]))))
  data[!!(as.numeric(idx)), ]
}

#Try sampling
sample_each(mydf, 'age', 2)

dplyr 你可以这样做...

library(dplyr)

df2 <- mydf %>% group_by(age, region, gender) %>% sample_n(1) #select one from each group

sample <- mydf %>% sample_n(24 - nrow(df2)) %>%               #select rest randomly
            bind_rows(df2)                                    #add first set back in

由于您构建示例数据的方式(6=2*3,因此非常循环),您的示例数据并未涵盖所有可能的组,但这种方法应该适用于更一般的情况。