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

如何用dplyr语法结合DuckDB的setseed()实现确定性随机数生成?

解决方案:结合DuckDB种子设置与dplyr实现结果可复现

要让基于DuckDB的dplyr分析结果可复现,核心是在生成随机数之前给DuckDB设置固定的随机种子。因为arrow::to_duckdb()会把数据导入DuckDB引擎执行后续操作,所以需要通过dplyr调用DuckDB的种子设置逻辑,具体有两种可行方式:

方式1:执行DuckDB的SET SEED语句

利用dplyr::sql()直接执行DuckDB的SET SEED命令,放在生成随机数的步骤之前:

# dplyr version 1.1.1
# arrow version 11.0.0.3
# duckdb 0.7.1.1
out_dir <- tempfile()
arrow::write_dataset(mtcars, out_dir, partitioning = "cyl")

mtcars_ds <- arrow::open_dataset(out_dir)

# 设置随机种子(示例用123,可替换为任意整数)
mtcars_smry <- mtcars_ds |>
  arrow::to_duckdb() |>
  dplyr::sql("SET SEED 123;") |>  # 关键步骤:先固定DuckDB随机种子
  dplyr::mutate(
    fold = ceiling(3 * random())
  ) |>
  dplyr::summarize(
    avg_hp = mean(hp, na.rm = TRUE),  # 加上na.rm消除缺失值警告
    .by = c(cyl, fold)
  )

mtcars_smry |>
  dplyr::collect()

方式2:调用DuckDB的setseed()函数

也可以在mutate中先调用DuckDB的setseed()函数(该函数接受0到1之间的数值作为种子),再生成随机数:

mtcars_smry <- mtcars_ds |>
  arrow::to_duckdb() |>
  dplyr::mutate(
    dummy = setseed(0.123),  # 设置0-1范围内的种子值
    fold = ceiling(3 * random())
  ) |>
  dplyr::select(-dummy) |>  # 移除无用的临时列
  dplyr::summarize(
    avg_hp = mean(hp, na.rm = TRUE),
    .by = c(cyl, fold)
  )

关键说明

  • 只要每次分析使用相同的种子值,就能得到完全一致的随机分组和统计结果。
  • 原代码中的mean(hp)会触发缺失值警告,建议显式添加na.rm = TRUE明确处理缺失值。

内容的提问来源于stack exchange,提问作者Ashirwad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:06:25