具有多个条件的行 "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,因此非常循环),您的示例数据并未涵盖所有可能的组,但这种方法应该适用于更一般的情况。
我有一个包含 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,因此非常循环),您的示例数据并未涵盖所有可能的组,但这种方法应该适用于更一般的情况。