R语言循环抽样计算比例并保存结果的技术问询
解决R语言循环抽样并保存比例的问题
首先修正你原代码中的基础问题:当前代码执行nrow(data)时data还未被读取,需先完成数据导入。以下是针对循环抽样和比例保存需求的完整解决方案,包含基础循环法和更高效的向量式实现:
1. 修正数据导入与预处理
先完成数据的正确导入和预处理,同时优化代码效率:
library(data.table) # 下载并读取压缩数据(data.table的fread支持直接读取.gz文件) url = "http://data.insideairbnb.com/brazil/rj/rio-de-janeiro/2022-09-21/data/listings.csv.gz" tmp = tempfile() download.file(url, tmp) dt = fread(tmp) # 计算总行数 total_rows <- nrow(dt) cat("数据总行数:", total_rows, "\n") # 创建整租房源二元标识(1=整租,0=其他) dt[, room_type_binary := ifelse(room_type == "Entire home/apt", 1, 0)] # 计算完整数据集的整租房源比例(用mean直接计算1的占比,比table+prop.table更简洁) full_prop <- mean(dt$room_type_binary) cat("完整数据集整租房源比例:", full_prop, "\n")
2. 基础循环实现10000次抽样
先初始化一个固定长度的空向量存储结果(提前分配内存比动态追加效率高),再用for循环完成重复抽样:
# 初始化存储比例的向量,提前分配10000个元素的内存 sample_props <- numeric(10000) # 循环执行10000次抽样与比例计算 for(i in 1:10000){ # 随机抽取100行样本(data.table用.N指代当前表总行数) sample_dt <- dt[sample(.N, 100)] # 计算样本中整租房源的比例并存入向量 sample_props[i] <- mean(sample_dt$room_type_binary) } # 查看前10次抽样的比例结果 head(sample_props, 10)
3. 更高效的replicate函数实现
R中推荐用replicate替代重复循环,代码更简洁且执行效率更高:
# 用replicate直接执行10000次抽样计算 sample_props_rep <- replicate(10000, { mean(dt[sample(.N, 100)]$room_type_binary) }) # 查看结果 head(sample_props_rep, 10)
关键优化点说明
- 用
mean()计算二元变量比例:二元变量的均值直接等于1的占比,比table()+prop.table()的组合更高效 - data.table的
.N语法:直接指代当前数据表的总行数,无需额外调用nrow() - 提前分配内存:初始化固定长度的向量,避免循环中用
c()动态追加导致的内存频繁扩容问题
内容的提问来源于stack exchange,提问作者Valério Souza Neto
相关产品推荐
相关产品推荐

