R语言如何按文件名部分匹配对数据框执行rbind合并
同前缀样本合并导出R代码实现
你原有逻辑的核心问题是单样本合并后的all_annotation没有持久存储,后续无法匹配前缀做批量合并,需要先把所有单样本合并结果存到列表中,再执行前缀匹配按行合并,完整实现代码如下:
library(dplyr) # 原有文件定义不变 anno_files<-c("R1000A_v1.hg19_multianno.txt", "R1000B_v1.hg19_multianno.txt" ,"R1000C_v1.hg19_multianno.txt", "RC1080A_v1.hg19_multianno.txt", "RC1080B_v1.hg19_multianno.txt" ) cancer_files<-c("R1000A_v1.hg19_multianno.txt.cancervar", "R1000B_v1.hg19_multianno.txt.cancervar" ,"R1000C_v1.hg19_multianno.txt.cancervar", "RC1080A_v1.hg19_multianno.txt.cancervar", "RC1080B_v1.hg19_multianno.txt.cancervar") # 提取样本名(简化原有循环写法) samples <- sapply(anno_files, function(x) unlist(strsplit(x, "\\."))[1], USE.NAMES = F) # 读取文件逻辑不变 myfilelist <- lapply(anno_files, read.delim, header=T) myfilelist2 <- lapply(cancer_files, read.csv, sep="\t", header=T) # 新增:存储所有单样本合并结果的列表,避免循环中变量被覆盖 all_sample_merged <- list() # 原有单样本合并逻辑修改 for (i in 1:length(myfilelist)){ all_annotation <- left_join(myfilelist[[i]], myfilelist2[[i]], by = c("Chr","Start","End","Ref","Alt")) all_annotation$sample_id <- samples[i] # 把当前样本合并结果存入列表 all_sample_merged[[i]] <- all_annotation # 保留原有单样本导出需求 write.csv(all_annotation, paste0("data/", samples[i], ".merged.csv"), row.names = F) } # 你原有提取样本前缀的逻辑,简化后写法不变,输出为 "R1000" "RC1080" samples2 <- unique(sapply(samples, function(x) { filename2_id <- unlist(strsplit(x, "\\_"))[1] substr(filename2_id, 1, nchar(filename2_id)-1) }, USE.NAMES = F)) # 你需要的前缀匹配合并导出逻辑 for (j in 1:length(samples2)){ current_prefix <- samples2[j] # 匹配所有sample_id以当前前缀开头的样本,和你的需求完全对应 match_index <- grep(paste0("^", current_prefix), sapply(all_sample_merged, function(df) unique(df$sample_id))) # 提取所有匹配到的样本表 match_dfs <- all_sample_merged[match_index] # 按行合并,用bind_rows比基础rbind兼容性更好,自动适配列顺序/列数差异 prefix_merged <- bind_rows(match_dfs) # 导出同前缀合并后的文件 write.csv(prefix_merged, paste0("data/", current_prefix, "_all_samples_merged.csv"), row.names = F) }
关键逻辑说明
- 单样本结果持久化:新增
all_sample_merged列表存储所有单样本合并后的表,避免循环过程中变量被覆盖丢失 - 前缀匹配规则:用
grep加正则^匹配sample_id开头为当前前缀的样本,不会误匹配到中间包含前缀字符的无关样本;如果需要匹配任意位置包含前缀的样本,删掉^即可 - 合并兼容性:用
dplyr::bind_rows替代基础rbind,自动处理不同表之间列数、列顺序不一致的情况,避免合并报错 - 导出命名规则:同前缀合并后的文件统一用
前缀_all_samples_merged.csv命名,和单样本结果做明确区分
内容的提问来源于stack exchange,提问作者zw_nz
相关产品推荐
相关产品推荐

