2017-11-10 73 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