You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数据框子集中高效按指定参数采样因子变量?

解决方案:按分组执行带权重的多次采样

首先,先补全你提供的数据生成代码,确保能正确创建数据框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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:12:06