首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-使用变量中的值从其他变量中有条件地选择多个值。

R-使用变量中的值从其他变量中有条件地选择多个值。
EN

Stack Overflow用户
提问于 2017-06-30 11:53:35
回答 1查看 49关注 0票数 0

我试图比较三维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))]找到了这些距离中最小的一个。示例:

代码语言:javascript
复制
  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.DistDistCol1,因此三个Source值都来自三个Colour1列。理想情况下,我的最后输出如下:

代码语言:javascript
复制
  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问题是非常宝贵的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-30 13:14:12

使用基R以非矢量化的方式执行此操作:

  1. 重建您的data.frame: df <- data.frame(c(25.5,8.7,832,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,832,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")) (Df) <- c("Colour1L","Colour1U","Colour1V","Colour2L","Colour2U","Colour2V","Colour3L","Colour3U","Colour3V","DistCol1","DistCol2","DistCol3","Min.Dist")
  2. 绕行 对于(i in 1:length(df$Colour1L)) { df$SourceLi <- df[paste0("Colour",substr(df$Min.Dist,8,8)[i],"L")] df$SourceUi <- df[paste0("Colour",substr(df$Min.Dist,8,8)[i],"U")] df$SourceVi <- df[paste0("Colour",substr(df$Min.Dist,8,8)[i],“V”)}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44845863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档