如何识别R数据框中两列结构不同的标识符差异?
在R中识别两列结构不同的标识符差异
你的数据里两列的标识符格式不一致,需要先提取出核心的唯一ID,再对比差异,具体步骤如下:
1. 提取核心标识符
两列的格式分别是:
- Description1:
[核心ID]_FASHEprotein[数字] - Description2:
tr|[核心ID]|[核心ID]_FASHEprotein[数字]
可以用基础R或stringr包提取核心ID:
基础R实现
# 假设数据框名为df df$ID1 <- sub("_.*", "", df$Description1) # 截取下划线前的内容 df$ID2 <- sub("tr\\|(.*)\\|.*", "\\1", df$Description2) # 提取两个竖线之间的内容
stringr包实现(更直观)
library(stringr) df$ID1 <- str_extract(df$Description1, "^[^_]+") # 匹配开头到下划线前的所有字符 df$ID2 <- str_extract(df$Description2, "(?<=tr\\|)[^|]+") # 匹配"tr|"之后到下一个竖线前的内容
2. 筛选差异行
提取完核心ID后,直接对比两列ID,筛选出不相等的行:
# 标记差异行 df$is_different <- df$ID1 != df$ID2 # 查看所有差异行 diff_result <- df[df$is_different, ] print(diff_result)
完整示例代码
# 构造示例数据框 df <- data.frame( Description1 = c("A0A2H1CVW1_FASHEprotein1", "A0A4E0RAA2_FASHEprotein2", "A0A2H1CFJ4_FASHEprotein4"), Description2 = c("tr|A0A2H1CVW1|A0A2H1CVW1_FASHEprotein1", "tr|A0A2H1BSG1|A0A2H1BSG1_FASHEprotein3", "tr|A0A2H1CFJ4|A0A2H1CFJ4_FASHEprotein4"), stringsAsFactors = FALSE ) # 提取核心ID(基础R方法) df$ID1 <- sub("_.*", "", df$Description1) df$ID2 <- sub("tr\\|(.*)\\|.*", "\\1", df$Description2) # 标记并筛选差异行 df$is_different <- df$ID1 != df$ID2 diff_result <- df[df$is_different, ] print(diff_result)
运行后会输出第2行的差异数据,明确展示两列标识符不一致的情况。
内容的提问来源于stack exchange,提问作者Marta López
相关产品推荐
相关产品推荐

