如何将数据框中的因子转换为R中预先指定的颜色名称?

时间:2015-08-11 08:54:44

标签: r

我试图为基因表达数据生成热图,这些数据也有代表临床数据的列,如下所示:https://www.biostars.org/p/18211/

我的问题是,heatmap.plus和heatmap.3都要求指定热图中颜色的矩阵实际上写为颜色名称。他们不会在列中取正常因子并将其转换为颜色。

这就是我的数据框架" df"看起来像:

sample_name     gender     chemotherapy     clinical_subtype
sample_01       M          alk              1
sample_02       F          tmz              2
sample_03       M          rad              2
sample_04       M          rad.tmz          4
sample_05       F          tmz              3

我可以使用以下代码生成与特定颜色匹配的每个因子的级别的数据框:

gender_colors <- with(df, data.frame(row.names = levels(gender), color = brewer.pal(nlevels(gender), name = 'Set1')))

如下所示(由于缺少样品,有3种颜色):

  color
  #66C2A5
F #FC8D62
M #8DA0CB

有没有办法使用这个数据框来索引原始因子,用相应的颜色替换它们,这样我的原始帧看起来就像下面这样?

sample_name     gender     chemotherapy     clinical_subtype
sample_01       #8DA0CB    #FC8D62          #FDAE61
sample_02       #FC8D62    #66C2A5          #FFFFBF
sample_03       #8DA0CB    #C2294A          #FFFFBF
sample_04       #8DA0CB    #FA9856          #A6D96A
sample_05       #FC8D62    #66C2A5          #1A9641

如果有一种更简单的方法可以做到这一点,并不要求我生成中间因子水平匹配的数据框到特定的颜色可能会容易得多,但是对这个问题的任何帮助将不胜感激!

      color
1     #D7191C
2     #FDAE61
3     #FFFFBF
4     #A6D96A
5     #1A9641

1 个答案:

答案 0 :(得分:1)

我建议保持简单,并使用public int function(int anyInt){ if(anyInt>15){ return 2; } else if(anyInt>0){ return 1; } else{ //anyInt==0 or smaller return 0; } } 将各种颜色数据框连接到主merge()数据框。例如,要将性别df数据框加入color,您可以使用此功能:

df

这会使color.gender <- data.frame(gender=c("", "F", "M"), color=c("#66C2A5", "#FC8D62", "#8DA0CB")) df <- merge(df, color.gender, by="gender") 看起来如下所示:

df

如果您被限制在一定数量的列或名称,您可以轻松地重做数据框。