R语言如何均匀随机缩减7万行dataframe至1万行
R语言实现全范围均匀缩减dataframe行数的方法
完全可以实现,根据你对采样均匀度的要求,有两种常用方案可选:
方案1:等距系统抽样(优先推荐,均匀性最稳定)
这个方法会严格按照固定间隔从数据集首尾到中间均匀取样,绝对不会出现采样点集中在某一段、或者直接删除前/后连续行的问题,最贴合你“采样结果在整个数据集范围内均匀分布”的要求。
实现逻辑:从70000行数据中均匀取10000个点位,相邻点位间隔固定,覆盖从第一行到最后一行的全量数据范围。
参考代码(假设你的原始dataframe命名为df):
# 基础参数计算 total_row <- nrow(df) target_sample_num <- 10000 # 生成等距抽样索引:从第1行到最后1行生成10000个等距点位 sample_idx <- seq(from = 1, to = total_row, length.out = target_sample_num) |> round() |> unique() # 处理计算结果为小数时的索引重复问题 # 提取采样后数据集 df_sampled <- df[sample_idx, ]
该方法会自动包含数据集的第一行和最后一行,所有采样点等距覆盖全量数据范围,均匀性不会受随机波动影响。
方案2:无放回简单随机抽样
如果你不需要严格等距,只需要样本随机散布在全数据集、不集中在首尾段,可以用基础随机抽样方法:
set.seed(42) # 设定随机种子,保证采样结果可复现 df_sampled_random <- df[sample(nrow(df), size = 10000, replace = FALSE), ]
这个方法是从70000行里完全随机无放回抽取10000行,不会出现连续删除前6万/后6万行的问题,但存在极小概率出现局部区段样本偏多/偏少的情况,对均匀度要求极高的场景不推荐。
注:两种方法都不会修改你原始dataframe的列结构,你给出的ID、username、text、date字段都会完整保留。
内容的提问来源于stack exchange,提问作者Quantizer
相关产品推荐
相关产品推荐

