如何在R中基于条件移除特定类别60%的数据?
解决R中移除特定类别60%数据并保留原数据集结构的问题
我明白你的问题了——你想保留原数据集的整体结构,只移除Outcome=="diabetes"这个类别里60%的数据,而不是单独提取这个类别再切片。原来的代码确实只处理了糖尿病组,没把其他类别加回来,我给你两种简单的解决方法:
方法一:用dplyr分组采样(推荐)
这种方法通过分组后按比例采样,一步完成筛选,代码简洁且保留原数据集的结构:
library(dplyr) # 保留非糖尿病的全部数据,以及糖尿病的40%数据(即移除60%) dataset_filtered <- dataset %>% group_by(Outcome) %>% slice_sample(prop = ifelse(Outcome == "diabetes", 0.4, 1)) %>% ungroup()
代码解释:
group_by(Outcome):按Outcome字段分组,这样我们可以对不同类别分别处理slice_sample(prop = ...):对每个组按指定比例采样。这里给非糖尿病组设置比例为1(保留全部),糖尿病组设置为0.4(保留40%,相当于移除60%)ungroup():取消分组,回到普通的数据框结构
方法二:拆分后合并(更直观)
如果你觉得分组的逻辑有点绕,可以先拆分数据集,分别处理后再合并:
library(dplyr) # 第一步:提取所有非糖尿病的数据(全部保留) non_diabetes_data <- dataset %>% filter(Outcome != "diabetes") # 第二步:提取糖尿病数据并随机保留40% diabetes_remaining <- dataset %>% filter(Outcome == "diabetes") %>% slice_sample(prop = 0.4) # 第三步:合并两部分数据,得到最终结果 dataset_filtered <- bind_rows(non_diabetes_data, diabetes_remaining)
注意事项:
- 如果你使用的是旧版本的
dplyr(1.0.0之前),slice_sample可能不存在,可以用sample_frac(0.4)代替 - 因为是随机采样,每次运行得到的具体行可能略有不同,但整体比例会符合要求
验证结果
你可以用下面的代码检查处理后各类别的数量,确认糖尿病组确实只保留了约40%:
# 原数据集类别数量 dataset %>% count(Outcome) # 处理后数据集类别数量 dataset_filtered %>% count(Outcome)
内容的提问来源于stack exchange,提问作者user9128740
相关产品推荐
相关产品推荐

