如何根据与datTraits的行列交集筛选tpm_datExpr数据框?
筛选数据框保留与另一个数据框行名匹配的列
需求:有两个尺寸不同的数据框tpm_datExpr和datTraits,其中tpm_datExpr的列名与datTraits的行名存在部分重合。需要筛选tpm_datExpr,仅保留那些列名在datTraits行名中的列,最终让tpm_datExpr保留278列。
原始数据信息
> colnames(tpm_datExpr)[1:10] [1] "D5247_S53_L006" "D5248_S54_L006" "D5249_S67_L008" "E02874_L1_S1_L001" [5] "E02875_L1_S2_L001" "E02876_L1_S3_L001" "E02877_L1_S4_L001" "E02878_L1_S5_L001" [9] "E02879_L1_S6_L001" "E02880_L1_S7_L001" > rownames(datTraits)[1:10] [1] "D5247_S53_L006" "D5248_S54_L006" "D5249_S67_L008" "E02874_L1_S1_L001" [5] "E02875_L1_S2_L001" "E02876_L1_S3_L001" "E02877_L1_S4_L001" "E02878_L1_S5_L001" [9] "E02879_L1_S6_L001" "E02880_L1_S7_L001" > ncol(tpm_datExpr) [1] 623 > nrow(datTraits) [1] 278
解决方案
方法1:基础R语法
直接利用索引和匹配运算符完成筛选:
# 提取datTraits的行名作为匹配目标 common_names <- rownames(datTraits) # 筛选tpm_datExpr中列名属于common_names的列 tpm_datExpr_filtered <- tpm_datExpr[, colnames(tpm_datExpr) %in% common_names]
验证结果:
# 检查筛选后的数据框列数 ncol(tpm_datExpr_filtered) # 预期输出为278
方法2:tidyverse风格(dplyr包)
如果习惯使用tidyverse工具链,可以用select()函数结合all_of()实现:
library(dplyr) tpm_datExpr_filtered <- tpm_datExpr %>% select(all_of(rownames(datTraits)))
说明
%in%用于判断tpm_datExpr的列名是否存在于datTraits的行名集合中all_of()可以避免dplyr在处理名称时的自动匹配警告,确保完全按照给定名称筛选- 由于
datTraits恰好有278行,筛选后的tpm_datExpr会保留对应的278列
内容的提问来源于stack exchange,提问作者Recep Durgut
相关产品推荐
相关产品推荐

