坚持使用dpylr';s mutate/summary将颜色映射到可变级别
我一直没能想出一个好办法。我试图创建一个用户函数,用于将RColorBrewer颜色映射到数据帧中的可变级别。我正在igraph中绘制节点颜色,它需要一个颜色向量。我已经做到了这一步,在出错之前坚持使用dpylr';s mutate/summary将颜色映射到可变级别,r,dplyr,mutate,R,Dplyr,Mutate,我一直没能想出一个好办法。我试图创建一个用户函数,用于将RColorBrewer颜色映射到数据帧中的可变级别。我正在igraph中绘制节点颜色,它需要一个颜色向量。我已经做到了这一步,在出错之前 library(tidyverse) library(RColorBrewer) my_data <- data_frame( x = sample(c('red','white','foo'),25,T) ) my_data %>% group_by(x) %>
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
谢谢你的帮助 您不需要按
分组,只需使用mutate
并使用brewer.pal(n_distinct(x),'spectrum')
生成所需的颜色,然后使用match
将颜色映射到变量:
注意:我使用了tidyeval
语法以NSE样式捕获变量,因为我们使用的函数是dplyr
。但如果您愿意,可以选择其他方式编程
你希望从结果中得到多少颜色?长度为25的三种颜色?@Psidom,我想要一个有三种颜色的列。与x中的每个级别匹配/对应的级别。这非常好用。你能告诉我你为什么加了“!!”是吗?这是tidyeval
语法的一部分,您可以阅读更多有关它的内容。基本上,它将dplyr
动词中的符号计算为一列,例如mutate
和summary
。
function(df,vary){
df %>%
group_by(vary) %>%
mutate(Blues = brewer.pal(n_distinct(vary),'Spectral')) %>%
select(Blues)
}
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"
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"