如何在R语言中按后缀优先级保留同一前缀的唯一列条目?
通用R解决方案:按前缀分组保留指定优先级的特征条目
输入数据
df <- read.table(text="\ncolID\nA_14_EVB\nA_14_gEVB\nA_14_adj_p_r\nB_14_EVB\nB_14_adj_p_r\nC_16_adj_p_r\nC_16_gEVB\nD_17_16_gEVB\nD_00_87_adj_p_r", header = TRUE)
需求
- 对特征名称按前缀(去掉最后一个下划线后的部分)分组
- 相同前缀的条目,仅保留后缀优先级最高的条目,优先级顺序:
_EVB>_gEVB>_adj_p_r - 单个条目的前缀直接保留原条目
解决方案(dplyr版本)
library(dplyr) # 定义后缀优先级顺序 suffix_priority <- c("_EVB", "_gEVB", "_adj_p_r") result_df <- df %>% # 拆分前缀与后缀:提取最后一个下划线前的内容作为前缀,还原带下划线的后缀 mutate( prefix = sub("_(.*)$", "", colID), suffix = paste0("_", sub(".*_", "", colID)) ) %>% # 为每个后缀分配优先级数值(数值越小优先级越高) mutate(priority = match(suffix, suffix_priority)) %>% # 按前缀分组,筛选出该组内优先级最高的条目 group_by(prefix) %>% filter(priority == min(priority, na.rm = TRUE)) %>% # 去重(避免同一前缀下有重复最高优先级条目) distinct(colID, .keep_all = TRUE) %>% # 保留原列并取消分组 select(colID) %>% ungroup() # 输出结果 print(result_df)
解决方案(Base R版本)
如果不想加载外部包,可以用原生R代码实现:
# 定义后缀优先级顺序 suffix_priority <- c("_EVB", "_gEVB", "_adj_p_r") # 拆分前缀与后缀 df$prefix <- sub("_(.*)$", "", df$colID) df$suffix <- paste0("_", sub(".*_", "", df$colID)) # 分配优先级数值 df$priority <- match(df$suffix, suffix_priority) # 按前缀分组,保留每组优先级最高的条目 result_df <- do.call(rbind, lapply(split(df, df$prefix), function(group) { group[group$priority == min(group$priority, na.rm = TRUE), ] })) # 去重并仅保留原特征列 result_df <- unique(result_df[, "colID", drop = FALSE]) # 输出结果 print(result_df)
输出结果
两种方案都会得到符合需求的结果:
# A tibble: 5 × 1 colID <chr> 1 A_14_EVB 2 B_14_EVB 3 C_16_gEVB 4 D_17_16_gEVB 5 D_00_87_adj_p_r
代码说明
- 前缀拆分:用正则表达式
sub("_(.*)$", "", colID)匹配最后一个下划线及之后的内容并删除,确保无论特征名称长度如何,都能正确提取前缀(比如Height_14_20_EVB会提取出Height_14_20) - 优先级分配:通过
match()函数将后缀映射为优先级数值,保证严格按照指定顺序筛选 - 分组筛选:按前缀分组后,保留每组中优先级数值最小的条目,即对应最高优先级的后缀
内容的提问来源于stack exchange,提问作者Anik Dutta
相关产品推荐
相关产品推荐

