R语言如何对数据集随机重排100次计算cummean并标注迭代次数
方案1:tidyverse风格实现
依赖dplyr和purrr包,代码更简洁:
# 加载依赖 library(tidyverse) # 构造示例数据(和你提供的一致) ID <- seq.int(1,100) val <- rnorm(100) df <- cbind(ID, val) %>% as.data.frame() set.seed(123) # 固定随机种子,可复现结果 # 100次重排+计算 result <- map_dfr(1:100, function(iter_num) { df %>% slice_sample(prop = 1) %>% # 全量随机打乱行顺序 mutate( iter = iter_num, # 标注迭代编号(1-100) cum_pos = row_number(), # 标识当前累积用到的样本数量,不需要可删除 cm = cummean(val) # 计算累积均值 ) })
方案2:基础循环实现
逻辑更直观,不需要额外依赖除dplyr外的包:
# 构造示例数据 ID <- seq.int(1,100) val <- rnorm(100) df <- cbind(ID, val) %>% as.data.frame() set.seed(123) result_list <- list() for (i in 1:100) { # 随机打乱数据集 shuffled_df <- df[sample(nrow(df)), ] # 计算累积均值 shuffled_df$cm <- cummean(shuffled_df$val) # 新增迭代编号 shuffled_df$iter <- i # 新增累积样本数标识,不需要可删除 shuffled_df$cum_pos <- 1:nrow(shuffled_df) result_list[[i]] <- shuffled_df } # 合并所有迭代结果为总数据框 result <- do.call(rbind, result_list)
两种方案输出的结果结构完全一致,全程保留原始ID列,新增的iter列对应重排迭代编号,cum_pos列直接标识计算累积均值时用到的样本数量,可按需选择是否保留。
内容的提问来源于stack exchange,提问作者L.sicilis
相关产品推荐
相关产品推荐

