如何在R语言数据框中保留指定数量的随机抽取因子水平
R实现因子水平随机抽样保留的方案
你可以直接用基础R函数完成操作,不需要额外安装第三方包,习惯用tidyverse生态的话也可以用对应函数实现,核心逻辑都是「提取全量因子水平→无放回随机抽取80个目标水平→过滤数据集→清除未被选中的冗余因子水平」。
基础R实现
用到的核心函数:
levels():提取因子变量的所有水平sample():执行无放回随机抽样%in%:匹配观测所属的水平是否在保留列表中droplevels():删除过滤后不再出现的冗余因子水平
示例代码(假设你的数据集名为my_data,目标因子列名为cat_var):
# 设定随机种子,保证抽样结果可复现,数字可以随便填 set.seed(2024) # 提取全量水平,共140个 all_lv <- levels(my_data$cat_var) # 无放回抽取80个要保留的水平 keep_lv <- sample(all_lv, size = 80, replace = FALSE) # 过滤数据集,仅保留选中水平的观测 my_data_filtered <- my_data[my_data$cat_var %in% keep_lv, ] # 清除残留的空水平 my_data_filtered$cat_var <- droplevels(my_data_filtered$cat_var)
注意:如果需要重复得到同一组抽样结果,必须在抽样前运行set.seed(),否则每次运行脚本都会得到不同的保留水平。
tidyverse生态实现
如果你平时用dplyr流程处理数据,可以用更连贯的管道写法,因子清理可以用forcats包的fct_drop()函数,逻辑和基础R完全一致:
library(dplyr) library(forcats) set.seed(2024) # 抽取保留水平 keep_lv <- my_data %>% pull(cat_var) %>% levels() %>% sample(size = 80, replace = FALSE) # 过滤并清理水平 my_data_filtered <- my_data %>% filter(cat_var %in% keep_lv) %>% mutate(cat_var = fct_drop(cat_var))
结果校验
抽样过滤完成后,可以运行以下命令检查保留的水平数是否符合预期,正常运行后应该返回结果80:
length(levels(my_data_filtered$cat_var))
内容的提问来源于stack exchange,提问作者hana gh
相关产品推荐
相关产品推荐

