如何使用R识别两个不同文件夹下文件的chr_pos列差异
R对比两个文件夹对应文件chr_pos列差异的实现方法
前置准备
- 确认两个文件夹下的文件是一一对应关系,即匹配的文件名称完全一致,例如a文件夹下有sample1.csv,对应b文件夹下也有sample1.csv
- 提前安装依赖包,没有安装的先运行命令:
install.packages(c("tidyverse", "fs"))tidyverse用于数据处理和通用文件读写fs用于批量读取文件路径,匹配对应文件
完整实现代码
# 加载依赖包 library(tidyverse) library(fs) # 1. 定义两个文件夹的本地路径,可根据实际路径修改 dir_a <- "./a" dir_b <- "./b" # 2. 读取两个文件夹下的所有目标文件,按文件后缀匹配可修改正则规则 # 示例匹配csv/tsv/txt格式文件,其他格式调整regexp参数即可 files_a <- dir_ls(dir_a, regexp = "\\.(csv|tsv|txt)$") files_b <- dir_ls(dir_b, regexp = "\\.(csv|tsv|txt)$") # 匹配两个文件夹下名称相同的对应文件 file_names_a <- path_file(files_a) file_names_b <- path_file(files_b) common_files <- intersect(file_names_a, file_names_b) # 无匹配文件时终止运行并提示 if(length(common_files) == 0) stop("两个文件夹下不存在名称匹配的对应文件") # 3. 批量处理每一组对应文件,提取chr_pos列差异 diff_result <- map_dfr(common_files, function(curr_file){ # 分别读取两组文件 df_a <- read_csv(file.path(dir_a, curr_file), show_col_types = FALSE) df_b <- read_csv(file.path(dir_b, curr_file), show_col_types = FALSE) # 检查文件是否包含chr_pos列 if(!"chr_pos" %in% colnames(df_a)) stop(paste0("a文件夹下的", curr_file, "缺少chr_pos列")) if(!"chr_pos" %in% colnames(df_b)) stop(paste0("b文件夹下的", curr_file, "缺少chr_pos列")) # 提取两个文件的chr_pos值,默认去重,不需要去重则删除unique() pos_a <- unique(df_a$chr_pos) pos_b <- unique(df_b$chr_pos) # 计算差异值 only_in_a <- setdiff(pos_a, pos_b) # 仅在a文件夹该文件中存在的chr_pos only_in_b <- setdiff(pos_b, pos_a) # 仅在b文件夹该文件中存在的chr_pos # 整理差异结果返回 bind_rows( tibble(file_name = curr_file, chr_pos = only_in_a, exist_range = "仅a文件夹存在"), tibble(file_name = curr_file, chr_pos = only_in_b, exist_range = "仅b文件夹存在") ) }) # 4. 输出查看差异结果 print(diff_result) # 可选:将差异结果导出为本地csv文件 write_csv(diff_result, "./chr_pos差异结果.csv")
结果说明
- 输出的
diff_result共3列:file_name为对应匹配的文件名,chr_pos为存在差异的位置值,exist_range标注该值仅存在于哪个文件夹的对应文件中 - 若某组对应文件的chr_pos列完全一致,该文件不会出现在差异结果中
特殊场景调整
- 若文件为excel格式,将
read_csv替换为readxl::read_excel即可,提前安装readxl包 - 若需要统计重复值的数量差异,删除代码中的
unique(),改用table()统计两个文件的chr_pos出现频率后再做对比即可
内容的提问来源于stack exchange,提问作者codelearner
相关产品推荐
相关产品推荐

