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

如何对数据库两列随机抽取样本并逐步计算均值?

问题解答

完全可行!你说的这种逐步更新均值的方式叫递推式均值计算,数学逻辑是成立的——每一步的新均值可以通过旧均值和新样本值直接推导,不用每次重新计算所有样本的总和,效率很高。公式是:

第n个均值 = (第n-1个均值 × (n-1) + 第n个样本值) / n

对应实现方法(以你的数据为例)

首先得先抽取一系列连续的随机样本,然后对每一列(工作时长time、接诊数obs)分别计算递推均值:

1. 抽取批量随机样本

先从你的数据框里抽取足够多的单次样本,拼接成一个新数据框:

library(dplyr)

set.seed(2020)
obs <- rnorm(10, mean = 0, sd = 1)
time <- rnorm(10, mean = 0.5, sd = 1)
rdf <- data.frame(obs, time)

# 抽取20个随机样本(数量可按需调整)
sampled_data <- replicate(20, sample_n(rdf, 1), simplify = FALSE) %>% 
  bind_rows()

2. 计算递推均值

用cumsum(累积求和)结合行号就能快速实现,不管用base R还是dplyr都很方便:

方式一:dplyr语法
sampled_data <- sampled_data %>%
  mutate(
    # obs列的递推均值:前1个、前2个、...、前n个样本的均值
    obs_running_mean = cumsum(obs) / row_number(),
    # time列的递推均值
    time_running_mean = cumsum(time) / row_number()
  )
方式二:base R语法
sampled_data$obs_running_mean <- cumsum(sampled_data$obs) / seq_len(nrow(sampled_data))
sampled_data$time_running_mean <- cumsum(sampled_data$time) / seq_len(nrow(sampled_data))

对你当前代码的说明

你现在写的p <- replicate(100, expr = (sample_n(rdf, 1) + sample_n(rdf, 1))/2)是重复100次独立抽取两个样本算均值,和你要的“逐步累加样本更新均值”逻辑不一样,调整成上面的代码就能实现需求。

有没有现成函数?

R里没有专门的递推均值函数,但用cumsum+行号的方式已经足够简洁高效。如果需要更复杂的滑动窗口计算,可以用zoo包的rollapply,但对你的需求来说完全没必要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:11:20