You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:58:11