R语言:如何保留行名匹配的数据行并实现正确列合并?
问题分析与解决方案
核心问题
- 正则表达式错误:你用
grepl('.1$', rownames(exp.normal))时,.在正则语法里是通配符,会匹配任意单个字符,导致误删类似gene1这类行名,应该用转义符匹配实际的点。 - 筛选逻辑冗余易出错:多次交叉筛选可能因行名顺序、重复值等导致最终两个数据框行数不一致,更稳妥的方式是直接提取两者共有的行名再分别筛选。
- 可能合并时用错对象:你最后生成了
exp.norm,但如果合并时误用了未最终筛选的exp.normal(19947行),就会和exp.kirp.samp行数不匹配报错。
修正后的代码
# 第一步:清洗exp.normal数据 # 去掉行和为无穷的行 exp.normal <- exp.normal[!is.infinite(rowSums(exp.normal)), ] # 去掉含NA的行 exp.normal <- na.omit(exp.normal) # 去掉行名以".1"结尾的行(注意正则转义) exp.normal <- exp.normal[!grepl("\\.1$", rownames(exp.normal)), ] # 第二步:获取两个数据框共有的行名 common_rownames <- intersect(rownames(exp.normal), rownames(exp.kirp)) # 第三步:分别筛选两个数据框,保留共同行名的行 exp.normal_filtered <- exp.normal[common_rownames, ] exp.kirp_filtered <- exp.kirp[common_rownames, ] # 第四步:按列合并(此时行数必然一致) merged_df <- cbind(exp.normal_filtered, exp.kirp_filtered)
关键说明
- 正则转义:
\\.才是匹配实际的点字符,确保只删除行名确实以.1结尾的行。 - 共同行名筛选:用
intersect直接提取两者都存在的行名,再以此为索引筛选两个数据框,保证行数、行名完全匹配,包括顺序。 - 验证维度:合并前可以运行
dim(exp.normal_filtered)和dim(exp.kirp_filtered)确认行数一致,避免报错。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

