如何用R提取两个Excel文件的共同行?现有方法返回空结果
从两个Excel文件提取共同行的可行方法
先排查之前方法失效的可能原因
- 方法一失效大概率是匹配列存在格式差异:比如数据类型不统一(一个是因子型、一个是字符型)、内容含首尾空格、大小写不一致,或者你选取的匹配列并非两个表中对应匹配的正确字段。
- 方法二用
bind_rows后找重复的逻辑不成立,因为两个表的列结构大概率不一致,合并后会自动补NA,自然找不到真正的重复行。
方案1:用dplyr::inner_join精准匹配(推荐)
这是最稳定的交集提取方式,直接指定匹配列即可:
library(readxl) library(dplyr) # 读取文件 fa <- read_excel("E:/Functional_annotation/Wild/Karumbyar_FA.xlsx") cq <- read_excel("E:/Functional_annotation/Wild/cq_genes.xlsx") # 查看列名,确认匹配字段(可注释掉) # colnames(fa) # colnames(cq) # 替换为实际列名:fa的匹配列 = cq的匹配列 cq_matched <- inner_join(fa, cq, by = c("fa第一列实际列名" = "evm.model.contig_303_pilon_pilon_pilon.1"))
inner_join会自动提取两个表中匹配列内容完全一致的行,保留所有列信息。
方案2:统一格式后用基础R匹配
如果偏好基础R语法,先修正匹配列的格式问题:
library(readxl) fa <- read_excel("E:/Functional_annotation/Wild/Karumbyar_FA.xlsx") cq <- read_excel("E:/Functional_annotation/Wild/cq_genes.xlsx") # 统一转换为字符型+去除首尾空格,消除格式差异 fa_match_col <- trimws(as.character(fa[, 1])) cq_match_col <- trimws(as.character(cq$evm.model.contig_303_pilon_pilon_pilon.1)) # 筛选共同行 cq_fa <- fa[fa_match_col %in% cq_match_col, ]
方案3:用data.table处理大数据量
如果你的32K行数据需要更高效率,用data.table的匹配逻辑:
library(readxl) library(data.table) fa <- as.data.table(read_excel("E:/Functional_annotation/Wild/Karumbyar_FA.xlsx")) cq <- as.data.table(read_excel("E:/Functional_annotation/Wild/cq_genes.xlsx")) # 生成统一格式的匹配列 fa[, match_col := trimws(as.character(.SD[, 1])), .SDcols = 1] cq[, match_col := trimws(as.character(evm.model.contig_303_pilon_pilon_pilon.1))] # 提取交集 cq_fa <- fa[match_col %in% cq$match_col, ] # 或者用join语法 cq_fa <- fa[cq, on = .(match_col = match_col), nomatch = 0]
内容的提问来源于stack exchange,提问作者idk_102
相关产品推荐
相关产品推荐

