基于CHR与BP列匹配合并文件并添加对应列的技术求助
基于CHR和BP列匹配合并两个文件
问题说明
需要将File2的AF列合并到File1中,仅保留CHR和BP两列同时匹配的行,最终得到仅包含匹配结果的文件。
原始文件内容
- File1:
CHR BP SNP ZSCORE 1 2534 rs123 0.5 1 2860 rs225 0.1 1 10000 rs356 0.8
- File2:
CHR BP AF 1 2534 0.02 1 6538 0.1 1 12345 0.1
期望输出(File3)
CHR BP SNP ZSCORE AF 1 2534 rs123 0.5 0.02
可行解决方案
1. R(base R)
使用merge()时,明确指定匹配列并设置内连接,同时提前去重避免多对多匹配问题:
# 读取文件 file1 <- read.table("File1", header = TRUE, stringsAsFactors = FALSE) file2 <- read.table("File2", header = TRUE, stringsAsFactors = FALSE) # 去重(若存在重复的CHR+BP组合) file1_clean <- file1[!duplicated(file1[, c("CHR", "BP")]), ] file2_clean <- file2[!duplicated(file2[, c("CHR", "BP")]), ] # 内连接合并,仅保留双向匹配的行 file3 <- merge(file1_clean, file2_clean, by = c("CHR", "BP"), all = FALSE) # 输出结果,保持原始空格分隔格式 write.table(file3, "File3", sep = " ", row.names = FALSE, quote = FALSE)
2. R(dplyr)
用inner_join()实现严格的内连接,配合distinct()去重:
library(dplyr) file1 <- read.table("File1", header = TRUE, stringsAsFactors = FALSE) file2 <- read.table("File2", header = TRUE, stringsAsFactors = FALSE) file3 <- file1 %>% distinct(CHR, BP, .keep_all = TRUE) %>% inner_join(file2 %>% distinct(CHR, BP, .keep_all = TRUE), by = c("CHR", "BP")) write.table(file3, "File3", sep = " ", row.names = FALSE, quote = FALSE)
3. AWK
通过数组映射快速匹配,无需提前排序:
awk 'NR==FNR {af[$1,$2]=$3; next} ($1,$2) in af {print $0, af[$1,$2]}' File2 File1 > File3
- 逻辑:先遍历File2,用
CHR,BP作为键存储AF值;再遍历File1,匹配成功则输出整行加对应AF。
4. Unix join 命令
需先按匹配列排序,再执行合并:
# 按CHR、BP列排序文件 sort -k1,1 -k2,2 File1 > File1_sorted sort -k1,1 -k2,2 File2 > File2_sorted # 合并并指定输出列 join -1 1 -2 1 -1 2 -2 2 -o 1.1,1.2,1.3,1.4,2.3 File1_sorted File2_sorted > File3 # 清理临时文件(可选) rm File1_sorted File2_sorted
- 参数说明:
-1 1 -2 1指定CHR为第一匹配列,-1 2 -2 2指定BP为第二匹配列;-o定义输出列的顺序。
内容的提问来源于stack exchange,提问作者narm
相关产品推荐
相关产品推荐

