如何对数据库两列随机抽取样本并逐步计算均值?
问题解答
完全可行!你说的这种逐步更新均值的方式叫递推式均值计算,数学逻辑是成立的——每一步的新均值可以通过旧均值和新样本值直接推导,不用每次重新计算所有样本的总和,效率很高。公式是:
第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
相关产品推荐
相关产品推荐

