如何在R语言中将矩阵子组与颜色列表关联?
解决子组编号与颜色列表关联的问题
我帮你排查了下问题所在——你的代码之所以全返回NA,核心原因是子组编号的格式和你指定的levels不匹配!
看你的子组数据,都是纯数字(1、3、4这些),但你在factor()里设置的levels是paste0("C",1:6),也就是带"C"前缀的字符串("C1"、"C2"...),数字和带前缀的字符串完全没法对应上,所以转换时所有值都匹配不到levels,自然全成NA了。
给你几个更靠谱的实现方法,按需选择:
方法1:直接用数字子组匹配颜色(最简单)
如果你的子组本身就是1-6的数字,直接把levels设为数字即可:
# 直接用数字作为levels,和你的子组编号完全对应 colours <- as.character(factor(pca_matrix[,"Subgroup"], levels = 1:6, labels = c("blue", "red", "yellow", "green", "black", "pink")))
方法2:先转成带"C"前缀的字符串再匹配
如果你后续需要带"C"前缀的分组标识,可以先把数字子组转成对应字符串,再做映射:
# 先将数字子组转为带C的字符串格式 pca_matrix$Subgroup_with_C <- paste0("C", pca_matrix[,"Subgroup"]) # 再用带前缀的levels做匹配 colours <- as.character(factor(pca_matrix$Subgroup_with_C, levels = paste0("C", 1:6), labels = c("blue", "red", "yellow", "green", "black", "pink")))
方法3:用命名向量映射(最直观,不易出错)
我个人更推荐这种方式,逻辑清晰,排查问题也方便:
# 创建一个命名向量,名字是子组编号(转成字符串避免数字/字符串类型问题),值是对应颜色 color_mapping <- c( "1" = "blue", "2" = "red", "3" = "yellow", "4" = "green", "5" = "black", "6" = "pink" ) # 直接通过子组编号索引命名向量,得到对应颜色 colours <- color_mapping[as.character(pca_matrix[,"Subgroup"])]
这种方法的好处是:就算你的数据里没有某些子组(比如你示例里没有2、5、6),也只会对应这些缺失子组的位置返回NA,不会全部变成NA,更容易定位问题。
用你的示例数据测试的话,子组3、4、1会分别返回"yellow"、"green"、"blue",完全符合预期。
内容的提问来源于stack exchange,提问作者Edward Muldrew
相关产品推荐
相关产品推荐

