如何提取对称大矩阵行列名中含aceae的科名并替换原名称?
提取矩阵行列名中的科名并替换
方法一:基础R实现
假设你的行列名向量为col_names,目标矩阵为your_matrix,可按以下步骤操作:
# 示例行列名向量 col_names <- c("d__Bacteria_p__Firmicutes_c__Clostridia_o__Lachnospirales_f__Lachnospiraceae_g__Tuzzerella__", "d__Bacteria_p__Proteobacteria_c__Gammaproteobacteria_o__Enterobacterales_f__Enterobacteriaceae_g__Escherichia__") # 拆分每个名称为子部分列表 split_names <- strsplit(col_names, "_") # 提取第6部分并筛选以"aceae"结尾的名称 family_names <- sapply(split_names, function(x) { fam <- x[6] # 仅保留符合条件的科名,不符合的设为NA(可根据需求调整) if (grepl("aceae$", fam)) fam else NA }) # 替换矩阵的行列名 rownames(your_matrix) <- family_names colnames(your_matrix) <- family_names
方法二:使用stringr简化操作
如果已加载stringr包,可利用向量化操作提升效率,更适合处理大规模行列名:
library(stringr) # 拆分后直接提取第6列(simplify=TRUE返回矩阵,避免列表循环) family_names <- str_split(col_names, "_", simplify = TRUE)[, 6] # 验证并过滤,仅保留以"aceae"结尾的名称 family_names <- ifelse(str_detect(family_names, "aceae$"), family_names, NA) # 应用到矩阵行列名 rownames(your_matrix) <- family_names colnames(your_matrix) <- family_names
关键说明
- 若部分行列名拆分后第6部分不是以"aceae"结尾,代码中会将其设为
NA,你可根据实际需求修改逻辑(比如保留原名称) - 针对大矩阵,
str_split(..., simplify=TRUE)的效率远高于列表循环处理,更推荐使用
内容的提问来源于stack exchange,提问作者Sajad Shahbazi
相关产品推荐
相关产品推荐

