我正在尝试比较 3D CIELuv 颜色空间中的颜色,并且我想确定最接近我感兴趣的主要颜色的颜色的 L、U 和 V 值。我已经计算了每种源颜色(由每个颜色的三个坐标 L、U 和 V 表示)和原色(我也有 LUV 坐标,空间未显示)之间的欧几里得距离。每种颜色与原色之间的距离存储在三个DistCol
变量中。然后我使用df$Min.Dist <- colnames(df[c(10:12)])[unlist(apply(df[c(10:12)], 1, which.min))]
. 例子:
Colour1L Colour1U Colour1V Colour2L Colour2U Colour2V Colour3L Colour3U Colour3V DistCol1 DistCol2 DistCol3 Min.Dist
1 25.5 9.0 -54.5 98.8 0.0 -1.6 63.9 55.0 60.2 25.4 82.1 137.8 DistCol1
2 8.7 14.8 5.6 41.7 133.2 27.6 41.7 133.2 27.6 144.2 58.3 133.3 DistCol2
3 83.2 24.7 -42.7 21.6 -0.4 0.8 83.2 24.7 -42.7 12.1 170.6 102.3 DistCol1
4 55.0 -49.8 62.5 99.2 0.1 -1.8 55.0 -49.8 62.5 213.7 103.4 67.7 DistCol3
我想使用Min.Dist
变量(或任何其他方法,如果有更好的方法!)有条件地选择最接近的颜色的所有三个 L、u 和 v 值。也就是说,在第一行中,Min.Dist
is DistCol1
,因此三个Source
值都来自三Colour1
列。理想情况下,我的最终输出如下所示:
Colour1L Colour1U Colour1V Colour2L Colour2U Colour2V Colour3L Colour3U Colour3V DistCol1 DistCol2 DistCol3 Min.Dist SourceL SourceU SourceV
1 25.5 9.0 -54.5 98.8 0.0 -1.6 63.9 55.0 60.2 25.4 82.1 137.8 DistCol1 25.5 9.0 -54.5
2 8.7 14.8 5.6 41.7 133.2 27.6 41.7 133.2 27.6 144.2 58.3 133.3 DistCol2 41.7 133.2 27.6
3 83.2 24.7 -42.7 21.6 -0.4 0.8 83.2 24.7 -42.7 12.1 170.6 102.3 DistCol1 83.2 24.7 -42.7
4 55.0 -49.8 62.5 99.2 0.1 -1.8 55.0 -49.8 62.5 213.7 103.4 67.7 DistCol3 55.0 -49.8 62.5
我以前使用ifelse
L、U 和 V 维度中的每一个的长嵌套表达式获得了类似的结果,例如,df$SourceL <- ifelse(df$Min.Dist =="DistCol1", Colour1L, ifelse(df$Min.Dist == "DistCol2", Colour2L, ifelse(...
但我正在处理真实数据中的 8-10 种颜色,这非常乏味且容易出错。
如果这个问题已经在其他地方得到回答,我深表歉意,并且非常感谢对此资源的任何建议或指导。也感谢在此论坛上回答问题的每个人 - 在过去几个月中,您的建议对于解决许多 R 问题非常宝贵!
使用基 R 以非矢量化方式执行此操作:
重建你的 data.frame:
df <- data.frame(c(25.5,8.7,83.2,55),c(9,14.8,24.7,-49.8),c(-54.5,5.6,-42.7,62.5), c(98.8,41.7,21.6,99.2),c(0,133.2,-0.4,0.1),c(-1.6,27.6,0.8,-1.8),c(63.9,41.7,83.2,55),c(55,133.2,24.7,-49.8),c(60.2,27.6,-42.7,62.5),c(25.4,144.2,12.1,213.7),c(82.1,58.3,170.6,103.4),c(137.8,133.3,102.3,67.7),c("DistCol1","DistCol2","DistCol1","DistCol3"))
colnames(df) <- c("Colour1L", "Colour1U", "Colour1V", "Colour2L", "Colour2U", "Colour2V", "Colour3L", "Colour3U", "Colour3V", "DistCol1", "DistCol2", "DistCol3", "Min.Dist")
遍历行
for (i in 1:length(df$Colour1L)) {
df$SourceL[i] <- df[[paste0("Colour",substr(df$Min.Dist,8,8)[i],"L")]][i]
df$SourceU[i] <- df[[paste0("Colour",substr(df$Min.Dist,8,8)[i],"U")]][i]
df$SourceV[i] <- df[[paste0("Colour",substr(df$Min.Dist,8,8)[i],"V")]][i]
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句