Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
坚持使用dpylr';s mutate/summary将颜色映射到可变级别_R_Dplyr_Mutate - Fatal编程技术网

坚持使用dpylr';s mutate/summary将颜色映射到可变级别

坚持使用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) %>

我一直没能想出一个好办法。我试图创建一个用户函数,用于将RColorBrewer颜色映射到数据帧中的可变级别。我正在igraph中绘制节点颜色,它需要一个颜色向量。我已经做到了这一步,在出错之前

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"