在R中基于多列筛选三个大型表格的共同变异
筛选三个表格共有的变异条目(基于CHR_POS、Allele1、Allele2)
以下提供两种常用工具的实现方案,均保留三个表格各自的原始结构,仅筛选出三表共有的目标条目:
方案一:使用R语言
假设三个表格文件名为table1.txt、table2.txt、table3.txt,均为空格分隔的文本格式:
# 1. 读取三个表格 table1 <- read.table("table1.txt", header = TRUE, stringsAsFactors = FALSE) table2 <- read.table("table2.txt", header = TRUE, stringsAsFactors = FALSE) table3 <- read.table("table3.txt", header = TRUE, stringsAsFactors = FALSE) # 2. 为每个表格生成唯一标识(拼接CHR_POS、Allele1、Allele2) table1$key <- paste(table1$CHR_POS, table1$Allele1, table1$Allele2, sep = "_") table2$key <- paste(table2$CHR_POS, table2$Allele1, table2$Allele2, sep = "_") table3$key <- paste(table3$CHR_POS, table3$Allele1, table3$Allele2, sep = "_") # 3. 找出三个表格共有的key common_keys <- intersect(intersect(table1$key, table2$key), table3$key) # 4. 筛选每个表格的共有条目,并移除临时生成的key列 filtered_table1 <- table1[table1$key %in% common_keys, !names(table1) %in% "key"] filtered_table2 <- table2[table2$key %in% common_keys, !names(table2) %in% "key"] filtered_table3 <- table3[table3$key %in% common_keys, !names(table3) %in% "key"] # 5. 输出筛选后的表格到文件 write.table(filtered_table1, "filtered_table1.txt", sep = " ", quote = FALSE, row.names = FALSE) write.table(filtered_table2, "filtered_table2.txt", sep = " ", quote = FALSE, row.names = FALSE) write.table(filtered_table3, "filtered_table3.txt", sep = " ", quote = FALSE, row.names = FALSE)
方案二:使用Python(Pandas库)
同样假设三个表格文件名为table1.txt、table2.txt、table3.txt:
import pandas as pd # 1. 读取三个表格 df1 = pd.read_table("table1.txt", sep=" ") df2 = pd.read_table("table2.txt", sep=" ") df3 = pd.read_table("table3.txt", sep=" ") # 2. 生成每个表格的唯一标识列 df1["key"] = df1["CHR_POS"] + "_" + df1["Allele1"] + "_" + df1["Allele2"] df2["key"] = df2["CHR_POS"] + "_" + df2["Allele1"] + "_" + df2["Allele2"] df3["key"] = df3["CHR_POS"] + "_" + df3["Allele1"] + "_" + df3["Allele2"] # 3. 获取三表共有的key集合 common_keys = set(df1["key"]) & set(df2["key"]) & set(df3["key"]) # 4. 筛选每个表格的共有条目,并删除临时key列 filtered_df1 = df1[df1["key"].isin(common_keys)].drop("key", axis=1) filtered_df2 = df2[df2["key"].isin(common_keys)].drop("key", axis=1) filtered_df3 = df3[df3["key"].isin(common_keys)].drop("key", axis=1) # 5. 保存筛选后的表格 filtered_df1.to_csv("filtered_table1.txt", sep=" ", index=False, quoting=3) filtered_df2.to_csv("filtered_table2.txt", sep=" ", index=False, quoting=3) filtered_df3.to_csv("filtered_table3.txt", sep=" ", index=False, quoting=3)
注意事项
- 上述方案严格匹配Allele1和Allele2的顺序,若需要忽略等位基因顺序(如A/G与G/A视为同一变异),需先统一等位基因排序(例如将两个等位基因按字母顺序排序后再生成key)。
- 若表格列名或分隔符与示例不同,需对应调整读取函数的参数(如
sep、header等)。
内容的提问来源于stack exchange,提问作者tacrolimus
相关产品推荐
相关产品推荐

