R语言如何向字符向量中添加等号分隔的命名键值新元素
R语言为基因类型向量批量追加命名随机颜色
问题场景
现有存储基因类型与对应配色的命名字符向量:
gene_colors <- c("protein_coding"="#1F78B4", "lncRNA"="#de08a0")
需要遍历other_genes基因列表,将列表中不存在于现有配色向量的基因类型,生成随机颜色后追加到向量中,最终向量要保持名称=颜色值的命名向量结构,可直接传入热图函数使用。
初始错误写法尝试用paste0()/str_c()拼接基因名、等号和颜色值,得到的是带等号的完整字符串,不符合命名向量的结构要求。
测试用other_genes向量内容:
other_genes <- c( "IG_C_gene", "IG_C_pseudogene", "IG_J_gene", "IG_V_gene", "IG_V_pseudogene", "lncRNA", "miRNA", "misc_RNA", "Mt_rRNA", "polymorphic_pseudogene", "processed_pseudogene", "protein_coding" )
初始错误代码:
library(tidyverse) library(randomcoloR) for(gene in other_genes){ if(!(gene %in% names(gene_colors))){ temp<-paste0(gene, '=', randomColor(1)) } }
正确实现方法
R中命名向量的名称是向量的属性,不需要通过拼接等号字符串的方式赋值,两种可直接运行的实现方案如下:
方案1:修正原有循环逻辑
直接通过名称索引给原向量新增元素,无需拼接字符串:
library(tidyverse) library(randomcoloR) for(gene in other_genes){ if(!gene %in% names(gene_colors)){ gene_colors[[gene]] <- randomColor(1) } }
方案2:向量化批量处理(推荐,效率更高)
无需写循环,先筛选出缺失的基因类型,批量生成颜色后一次性合并:
library(tidyverse) library(randomcoloR) # 提取所有未配置颜色的基因 missing_genes <- setdiff(other_genes, names(gene_colors)) # 批量生成随机颜色并设置名称 add_colors <- setNames(randomColor(length(missing_genes)), missing_genes) # 合并到原配色向量 gene_colors <- c(gene_colors, add_colors)
- 小提示:如果需要固定随机颜色结果保证复现,可以在生成颜色前运行
set.seed(123)(数字可自定义),避免每次运行颜色发生变化。
运行后得到的gene_colors和初始定义的结构完全一致,名称为基因类型,值为对应十六进制颜色码,可直接传入热图绘制函数使用。
内容的提问来源于stack exchange,提问作者mfeldbauer
相关产品推荐
相关产品推荐

