2017-11-10 14 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の3色? – Psidom

+0

@Psidom、3つの色を持つ1つの列が必要です。 xの各レベルに一致/対応するもの。 – elliot

答えて

2

あなただけmutateを使用して、brewer.pal(n_distinct(x), 'Spectral')に必要な色を生成し、その後matchを使用して変数に色をマッピングし、group_byを必要としません:

お知らせ:私はキャプチャするtidyeval構文を使用しましたdplyrの関数を使用しているため、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" 

、1つのベクトルを取り、その後、より理にかなって、おそらく色にマップ機能:

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)。基本的に 'mutly'や' summarize'のような 'dplyr'動詞のシンボルを列として評価します。 – Psidom

関連する問題