R语言如何按Stage列规则删除Study_ID字段的重复值
R语言按指定规则去重数据集实现方法
需求核心是按Study_ID去重时,优先保留Stage字段值为Stable的记录,仅当某个ID没有对应Stable记录时才保留Early Stage记录,以下提供两种可直接运行的实现方案:
方案1:dplyr实现(代码可读性高,适合日常数据处理)
首先确保已安装dplyr包,未安装可先运行install.packages("dplyr"),代码如下:
library(dplyr) # 构造原始测试数据集 data <- data.frame( Study_ID = c("100","100","200","300","400","400","500","500","600","700"), Stage = c("Early Stage","Stable","Stable","Early Stage","Early Stage","Stable","Early Stage","Stable","Stable","Early Stage") ) result <- data %>% # 设定Stage的保留优先级:Stable > Early Stage mutate(Stage = factor(Stage, levels = c("Stable", "Early Stage"))) %>% group_by(Study_ID) %>% # 组内按优先级排序,取第一条记录 arrange(Stage, .by_group = TRUE) %>% slice_head(n = 1) %>% # 还原Stage为字符格式,和原数据类型保持一致 mutate(Stage = as.character(Stage)) %>% ungroup()
方案2:base R实现(无需安装第三方包)
如果不想加载额外扩展包,可以用R原生函数实现,核心逻辑和方案1完全一致:
# 构造原始测试数据集 data <- data.frame( Study_ID = c("100","100","200","300","400","400","500","500","600","700"), Stage = c("Early Stage","Stable","Stable","Early Stage","Early Stage","Stable","Early Stage","Stable","Stable","Early Stage") ) # 新增优先级列:Stable权重为1(优先级更高),Early Stage权重为2 data$priority <- match(data$Stage, c("Stable", "Early Stage")) # 按Study_ID分组、优先级升序排序 data_sorted <- data[order(data$Study_ID, data$priority), ] # 去重:每个Study_ID仅保留排序后的第一条记录,删除临时优先级列 result <- data_sorted[!duplicated(data_sorted$Study_ID), c("Study_ID", "Stage")] # 可选:重置行号,和期望输出格式完全对齐 rownames(result) <- seq_len(nrow(result))
输出结果验证
运行上述任意方案后,打印result即可得到完全符合预期的输出:
Study_ID Stage 1 100 Stable 2 200 Stable 3 300 Early Stage 4 400 Stable 5 500 Stable 6 600 Stable 7 700 Early Stage
内容的提问来源于stack exchange,提问作者sabc04
相关产品推荐
相关产品推荐

