You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:如何保留行名匹配的数据行并实现正确列合并?

问题分析与解决方案

核心问题

  1. 正则表达式错误:你用grepl('.1$', rownames(exp.normal))时,.在正则语法里是通配符,会匹配任意单个字符,导致误删类似gene1这类行名,应该用转义符匹配实际的点。
  2. 筛选逻辑冗余易出错:多次交叉筛选可能因行名顺序、重复值等导致最终两个数据框行数不一致,更稳妥的方式是直接提取两者共有的行名再分别筛选。
  3. 可能合并时用错对象:你最后生成了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:35:20