如何从数据框子集中高效按指定参数采样因子变量?
解决方案:按分组执行带权重的多次采样
首先,先补全你提供的数据生成代码,确保能正确创建数据框df1:
# 生成原始数据 var1 <- rep(LETTERS[seq( from = 1, to = 3 )], each = 6) var2 <- rep(LETTERS[seq( from = 1, to = 3 )], 6) var3 <- rep(1:2, 3, each = 3) num <- rep(c(10, 11, 13, 8, 20, 5), each = 3) probs <- round(runif(18), 2) df1 <- data.frame(var1, var2, var3, num, probs)
接下来,按照var1和var3拆分数据框得到列表ls1:
# 按var1和var3分组拆分,生成数据框列表 ls1 <- split(df1, list(df1$var1, df1$var3)) # 清理可能存在的空分组(如果有的话) ls1 <- ls1[sapply(ls1, nrow) > 0]
现在,我们需要对ls1中的每个子数据框执行采样操作。根据你的需求,每个子数据框里的num是统一的采样次数(从数据生成逻辑来看,每个分组的num值完全相同),probs是对应var2的采样权重,我们可以用lapply遍历列表完成采样:
# 遍历每个分组执行带权重的采样 sampled_results <- lapply(ls1, function(x) { # 这里设置replace=TRUE是因为采样次数num可能大于var2的元素数量,根据需求可以调整 sample( x = x$var2, size = x$num[1], # 每个分组num值一致,取第一个即可 prob = x$probs, replace = TRUE ) })
补充说明:
- 如果你的分组中
num值可能不统一(虽然根据当前数据生成逻辑不会出现),可以根据实际需求调整size参数,比如如果需要对每行单独采样,可以进一步嵌套处理,但当前场景下取x$num[1]就足够。 replace=TRUE的作用是允许重复采样,如果你不需要重复采样,可以移除这个参数,但要确保num不大于子数据框的行数,否则会报错。
内容的提问来源于stack exchange,提问作者flee
相关产品推荐
相关产品推荐

