2017-11-10 74 views
1

我从来没有能够找到一个好办法来做到这一点。我正在尝试创建一个用于将RColorBrewer颜色映射到data_frame中的变量级别的用户函数。我在igraph中绘制节点颜色,它需要一个颜色矢量。在发生错误之前,我已经做到了这一步。坚持使用dpylr的mutate/summarize将颜色映射到可变级别

library(tidyverse) 
library(RColorBrewer) 

my_data <- data_frame(
    x = sample(c('red','white','foo'),25,T) 
) 

my_data %>% 
    group_by(x) %>% 
    mutate(Blues = brewer.pal(n_distinct(x),'Spectral')) ## this doesn't work 

我想要一个工作函数。类似以下内容:

function(df,vary){ 
    df %>% 
     group_by(vary) %>% 
     mutate(Blues = brewer.pal(n_distinct(vary),'Spectral')) %>% 
     select(Blues) 
    } 

感谢您的帮助!

+0

多少种颜色,你从结果期望?三种颜色的长度25? – Psidom

+0

@Psidom,我想要一列有三种颜色。一个匹配/对应于x中的每个级别。 – elliot

回答

2

你不需要group_by,只要使用mutate和生成你需要brewer.pal(n_distinct(x), 'Spectral')的颜色,然后用match映射颜色的变量:

注意:我使用的tidyeval语法捕捉NSE风格的变量,因为我们使用dplyr的函数。但是如果你愿意,你可以选择编程。

var_to_color <- function(df, var) { 
    var <- enquo(var) 
    df %>% 
     mutate(Colors = brewer.pal(n_distinct(!!var), 'Spectral')[match(!!var, unique(!!var))]) %>% 
     pull(Colors) 
} 

var_to_color(my_data, x) 
# [1] "#FC8D59" "#FFFFBF" "#FFFFBF" "#FFFFBF" "#99D594" "#FFFFBF" "#99D594" 
# [8] "#99D594" "#FC8D59" "#FFFFBF" "#FC8D59" "#FFFFBF" "#FFFFBF" "#99D594" 
#[15] "#FC8D59" "#FC8D59" "#99D594" "#FFFFBF" "#FC8D59" "#FC8D59" "#FC8D59" 
#[22] "#FC8D59" "#FFFFBF" "#FC8D59" "#FC8D59" 

my_data$x 
# [1] "white" "red" "red" "red" "foo" "red" "foo" "foo" "white" 
#[10] "red" "white" "red" "red" "foo" "white" "white" "foo" "red" 
#[19] "white" "white" "white" "white" "red" "white" "white" 

不使用dplyr,这需要一个载体的功能,然后将其映射到颜色可能更有意义:

var_to_color <- function(var) brewer.pal(n_distinct(var), 'Spectral')[match(var, unique(var))] 

var_to_color(my_data$x) 
# [1] "#FC8D59" "#FFFFBF" "#FFFFBF" "#FFFFBF" "#99D594" "#FFFFBF" "#99D594" 
# [8] "#99D594" "#FC8D59" "#FFFFBF" "#FC8D59" "#FFFFBF" "#FFFFBF" "#99D594" 
#[15] "#FC8D59" "#FC8D59" "#99D594" "#FFFFBF" "#FC8D59" "#FC8D59" "#FC8D59" 
#[22] "#FC8D59" "#FFFFBF" "#FC8D59" "#FC8D59" 
+0

谢谢。这工作相当完美。你能告诉我为什么你加了'!!'呢? – elliot

+0

它是'tidyeval'的语法的一部分,你可以在这里阅读更多关于它的内容(http://dplyr.tidyverse.org/articles/programming.html)。基本上,它将“dplyr”动词中的符号评估为“mutate”和“summarize”作为列。 – Psidom