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

如何在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

火山引擎 最新活动