基因标识数据处理:提取指定片段并过滤重复组合行
基因标识数据的两步处理方案(提取特征+去重)
嘿,我来给你分享两种实用的实现方案,刚好对应你需要的两步操作——先提取V1列下划线后的非数字特征,再过滤重复的V1-V2组合。不管你用Python/Pandas还是R语言,都能轻松搞定:
方案一:Python + Pandas 实现
Pandas是处理表格数据的利器,非常适合这类生物信息学数据的批量处理。
步骤1:提取V1列的目标特征
我们需要先拆分V1字符串,取下划线_后的部分,再去掉其中的数字和多余的符号(比如末尾的点):
- 用
str.split()拆分下划线,取第二部分; - 用正则表达式
\d+匹配所有数字并替换为空; - 用
str.rstrip('.')去掉末尾的点(对应例子中K277N.转成KN的需求)。
步骤2:过滤重复的V1-V2组合
用drop_duplicates()方法,指定以处理后的V1和V2作为去重依据,保留第一次出现的行即可。
完整代码示例
import pandas as pd # 原始数据(如果是从文件读取,可替换为 pd.read_csv('your_data.txt', sep='\s+')) raw_data = [ ["ENSP00000222573_N559D", "ENSG00000105855"], ["ENSP00000222573_N559D", "ENSG00000105855"], ["ENSP00000267853_E337*", "ENSG00000108239"], ["ENSP00000299441_R1672P,R1672G", "ENSG00000127415"], ["ENSP00000334642_K277N.", "ENSG00000134324"], ["ENSP00000342952_N585R", "ENSG00000134324"] ] # 转为DataFrame df = pd.DataFrame(raw_data, columns=["V1", "V2"]) # 步骤1:处理V1列 df['V1_processed'] = df['V1'].str.split('_').str[1] df['V1_processed'] = df['V1_processed'].str.replace(r'\d+', '', regex=True).str.rstrip('.') # 步骤2:去重,保留唯一的V1_processed-V2组合 df_clean = df.drop_duplicates(subset=['V1_processed', 'V2'], keep='first') # 输出最终结果 print("处理后的结果:") print(df_clean[['V1_processed', 'V2']].to_string(index=False))
运行后会输出你需要的最终结果:
V1_processed V2 ND ENSG00000105855 E* ENSG00000108239 RP,RG ENSG00000127415 KN ENSG00000134324 NR ENSG00000134324
方案二:R 语言实现
如果你日常用R做生物信息分析,用tidyverse套件可以快速完成同样的操作。
步骤1:提取V1列的目标特征
用str_split()拆分下划线,str_remove_all()去掉数字,str_remove()去掉末尾的点:
str_split(V1, "_", simplify = TRUE)[,2]直接取下划线后的部分;str_remove_all(V1_processed, "\\d+")移除所有数字;str_remove(V1_processed, "\\.$")移除末尾的点。
步骤2:过滤重复组合
用distinct()方法,指定以处理后的V1和V2作为去重依据,自动保留唯一行。
完整代码示例
library(tidyverse) # 原始数据 raw_data <- tibble( V1 = c("ENSP00000222573_N559D", "ENSP00000222573_N559D", "ENSP00000267853_E337*", "ENSP00000299441_R1672P,R1672G", "ENSP00000334642_K277N.", "ENSP00000342952_N585R"), V2 = c("ENSG00000105855", "ENSG00000105855", "ENSG00000108239", "ENSG00000127415", "ENSG00000134324", "ENSG00000134324") ) # 步骤1:处理V1列 data_processed <- raw_data %>% mutate(V1_processed = str_split(V1, "_", simplify = TRUE)[,2]) %>% mutate(V1_processed = str_remove_all(V1_processed, "\\d+")) %>% mutate(V1_processed = str_remove(V1_processed, "\\.$")) # 步骤2:去重,保留唯一组合 data_clean <- data_processed %>% distinct(V1_processed, V2, .keep_all = FALSE) # 输出结果 print(data_clean, row.names = FALSE)
运行后同样会得到你需要的最终结果。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

