在R语言中对数据表抽样及批量重复抽样的实现方法
如何在R中对单列CSV数据进行重复随机抽样?
嘿,作为R新手能想到用sample()函数抽取样本已经很棒了!你的当前代码Heights[sample(nrow(Heights), 5), ]完全没问题——因为你的数据是单列数据框,这个代码会随机抽取5行并返回对应的数值向量,和直接用sample(Heights[[1]], 5)效果一致。
接下来解决你最关心的重复抽样100次并保存结果的问题,这里有两种实用的方法,适合不同的理解习惯:
方法一:用replicate()快速实现(推荐)
replicate()是R中专门用来重复执行某段代码的函数,简洁又高效,非常适合这个场景:
# 1. 设置重复抽样的次数 num_samples <- 100 # 2. 执行重复抽样:每次抽取5个样本,重复100次 # simplify = FALSE 让结果以列表形式存储,每个元素对应一次抽样的结果 sampling_results <- replicate(num_samples, sample(Heights[[1]], 5), simplify = FALSE)
保存结果的方式:
- 如果想保留R原生格式,方便后续分析,可用
saveRDS():saveRDS(sampling_results, "repeated_height_samples.rds") # 后续读取时用:readRDS("repeated_height_samples.rds") - 如果要导出为CSV文件,先把列表转换成数据框:
# 将列表的每个元素(一次抽样结果)转成数据框的一行 results_df <- do.call(rbind, lapply(sampling_results, function(x) data.frame(sample_value = x))) # 添加抽样编号列,方便区分每次结果 results_df$sample_id <- rep(1:num_samples, each = 5) # 导出为CSV write.csv(results_df, "repeated_height_samples.csv", row.names = FALSE)
方法二:用循环实现(更直观,适合新手理解)
如果你觉得replicate()有点抽象,用for循环一步步来也很清晰:
# 1. 初始化一个空列表,用来存储每次抽样的结果 sampling_results <- list() # 2. 循环100次,每次抽样后存入列表 for (i in 1:100) { # 抽取5个样本,默认是*无放回抽样*(如果需要有放回,加上replace = TRUE) sampling_results[[i]] <- sample(Heights[[1]], 5) }
之后保存结果的方式和上面完全一样,就不再重复啦。
额外提醒:有放回 vs 无放回抽样
sample()默认是无放回抽样(同一个数值不会被抽到两次),如果你的需求是允许重复抽取同一个数值(比如模拟bootstrap抽样),只需要加上replace = TRUE参数:
sample(Heights[[1]], 5, replace = TRUE)
这样不管是单次抽样还是重复抽样,都能灵活调整啦!
内容的提问来源于stack exchange,提问作者Sebastian M.




