基于Base R去除互为反向的重复基因对行(禁用tidyverse)
问题描述
我正在使用Base R操作(禁止使用tidyverse),现有如下数据:
> geneA [1] "GNG7" "GNG7" "GNG7" "GNG12" "GNG12" "GNG12" "GNG2" "GNG2" "GNG2" [10] "GNG5" "GNG5" "GNG5" > geneB [1] "GNG12" "GNG5" "GNG2" "GNG7" "GNG5" "GNG2" "GNG5" "GNG12" "GNG7" [10] "GNG12" "GNG7" "GNG2"
处理后得到数据框GNGdata:
> GNGdata geneA geneB GENE_PAIR 1 GNG7 GNG12 GNG7;GNG12 2 GNG7 GNG5 GNG7;GNG5 3 GNG7 GNG2 GNG7;GNG2 4 GNG12 GNG7 GNG12;GNG7 5 GNG12 GNG5 GNG12;GNG5 6 GNG12 GNG2 GNG12;GNG2 7 GNG2 GNG5 GNG2;GNG5 8 GNG2 GNG12 GNG2;GNG12 9 GNG2 GNG7 GNG2;GNG7 10 GNG5 GNG12 GNG5;GNG12 11 GNG5 GNG7 GNG5;GNG7 12 GNG5 GNG2 GNG5;GNG2
现在需要过滤掉重复的基因对:比如GNG7;GNG12和GNG12;GNG7视为同一对,只保留其中一行,最终得到如下结果:
> GNGdata_filtered geneA geneB GENE_PAIR 1 GNG7 GNG12 GNG7;GNG12 2 GNG7 GNG5 GNG7;GNG5 3 GNG7 GNG2 GNG7;GNG2 4 GNG12 GNG5 GNG12;GNG5 5 GNG12 GNG2 GNG12;GNG2 6 GNG2 GNG5 GNG2;GNG5
解决方案
核心想法是为每个基因对生成一个标准化的唯一键——不管基因顺序如何,标准化后的键格式统一,之后基于这个键去重即可。
步骤1:生成标准化基因对键
拆分GENE_PAIR列的字符串,对每个拆分后的基因列表排序,再重新拼接成统一格式的字符串:
# 拆分GENE_PAIR为单个基因 split_pairs <- strsplit(GNGdata$GENE_PAIR, ";") # 对每个基因对排序后重新拼接,得到标准化键 standardized_pairs <- sapply(split_pairs, function(x) paste(sort(x), collapse = ";"))
步骤2:基于标准化键去重
用duplicated()函数标记重复的标准化键,只保留第一次出现的行:
# 筛选出非重复的行 GNGdata_filtered <- GNGdata[!duplicated(standardized_pairs), ]
完整可运行代码
# 构造原始数据框(如果还没生成的话) geneA <- c("GNG7", "GNG7", "GNG7", "GNG12", "GNG12", "GNG12", "GNG2", "GNG2", "GNG2", "GNG5", "GNG5", "GNG5") geneB <- c("GNG12", "GNG5", "GNG2", "GNG7", "GNG5", "GNG2", "GNG5", "GNG12", "GNG7", "GNG12", "GNG7", "GNG2") GNGdata <- data.frame(geneA, geneB, GENE_PAIR = paste(geneA, geneB, sep = ";")) # 生成标准化基因对键 split_pairs <- strsplit(GNGdata$GENE_PAIR, ";") standardized_pairs <- sapply(split_pairs, function(x) paste(sort(x), collapse = ";")) # 去重得到结果 GNGdata_filtered <- GNGdata[!duplicated(standardized_pairs), ] # 查看过滤后的数据框 GNGdata_filtered
内容的提问来源于stack exchange,提问作者moirasanti
相关产品推荐
相关产品推荐

