如何在R DataFrame中按ZIP码分层抽样并生成新数据框?
在R中提取指定行到新数据框&实现分层随机抽样
嘿,我来帮你搞定这个问题!首先,针对你已经拿到的那组行索引,提取指定行到新数据框非常直接;另外,我也会给你推荐更符合你原始需求(按ZIP码分层抽取30%样本)的自动化方法,这样以后不用手动生成索引啦~
一、用已有的行索引提取指定行
假设你的原房产数据框名为housing_data(如果实际名字不一样,替换成你的数据框名称就行),直接用索引做子集化操作就可以:
# 你已经得到的行索引 selected_rows <- c(8, 85, 5, 83, 66, 46, 39, 75, 101, 94, 10, 68, 63, 74, 22, 86, 42, 59, 52, 97, 62, 11, 44, 96, 88, 28, 9, 36, 2, 78, 49) # 提取指定行到新数据框 new_df <- housing_data[selected_rows, ]
注意这里的逗号[, ]不能省略,逗号后面留空表示保留原数据框的所有列。执行完这行代码,new_df就是你要的包含指定行的新数据框了。
二、更规范的分层随机抽样方法(按ZIP码抽取30%)
你原本的需求是从每个ZIP码对应的房源中抽取约30%的样本,手动生成索引不仅麻烦,还可能出现分层不均的问题。推荐两种更高效的自动化方法:
方法1:使用dplyr包(代码更简洁直观)
如果你还没安装dplyr包,先执行安装命令:
install.packages("dplyr") library(dplyr)
然后按ZIP码分组,每层抽取30%的无放回样本:
# 按ZIP分层,每组抽取30%样本 stratified_sample <- housing_data %>% group_by(ZIP) %>% slice_sample(prop = 0.3, replace = FALSE) %>% ungroup()
prop = 0.3:指定抽取每组30%的样本replace = FALSE:设置为无放回抽样,和你手动用sample时的参数一致ungroup():抽样完成后取消分组,得到常规的数据框结构
方法2:基础R实现(无需额外安装包)
如果你不想安装第三方包,用基础R的函数组合也能实现:
# 按ZIP码拆分原数据框 split_by_zip <- split(housing_data, housing_data$ZIP) # 对每个ZIP子集抽取30%的行 sampled_subsets <- lapply(split_by_zip, function(subset) { # 计算当前ZIP组的行数 subset_size <- nrow(subset) # 抽取约30%的行(round处理整数) sample_indices <- sample(1:subset_size, size = round(subset_size * 0.3), replace = FALSE) subset[sample_indices, ] }) # 将所有抽样后的子集合并为一个数据框 stratified_sample <- do.call(rbind, sampled_subsets)
这里用round(subset_size * 0.3)是因为样本数量必须是整数,四舍五入后能保证每组抽取的样本数接近30%。
内容的提问来源于stack exchange,提问作者324




