You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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.

火山引擎 最新活动