如何在R语言中按动物分组对十六进制颜色进行加权平均?
按Animal分组计算加权平均颜色的解决方案
要实现按Animal分组、以Bias为权重计算加权平均颜色,核心是先把十六进制颜色转换为可计算的RGB数值,完成加权平均后再转回十六进制格式,具体步骤如下:
完整代码实现
library(tidyverse) # 假设数据已读入为dat.an,若未读入可执行: # dat.an <- read_csv("dat.an") weighted_avg_color <- dat.an %>% # 将十六进制颜色拆分为R、G、B通道的数值 mutate( rgb = map(Colour, ~col2rgb(.) %>% as.vector()), R = map_dbl(rgb, ~.[1]), G = map_dbl(rgb, ~.[2]), B = map_dbl(rgb, ~.[3]) ) %>% # 按Animal字段分组 group_by(Animal) %>% # 计算各RGB通道的加权平均值,权重为Bias summarise( avg_R = weighted.mean(R, Bias), avg_G = weighted.mean(G, Bias), avg_B = weighted.mean(B, Bias), # 将平均后的RGB值转回十六进制颜色格式 weighted_avg_colour = rgb(round(avg_R), round(avg_G), round(avg_B), maxColorValue = 255) ) %>% ungroup() # 查看结果 print(weighted_avg_color)
代码解释
- 颜色转RGB:用
col2rgb()将十六进制颜色转换为0-255范围的RGB数值向量,再通过map_dbl拆分为单独的R/G/B列,方便后续计算。 - 加权平均计算:使用
weighted.mean()函数,以Bias作为权重,分别计算每组的R、G、B通道平均值。 - RGB转回十六进制:用
rgb()函数将平均后的数值转回十六进制,round()确保数值为整数(RGB值必须是0-255的整数),maxColorValue=255指定输入范围。
内容的提问来源于stack exchange,提问作者Ginko-Mitten
相关产品推荐
相关产品推荐

