r - 在 R 中查找所有列都相等的行

标签 r colors dataframe subset

我在 R 中有一个 data.frame。data.frame 有三列:R、G、B,分别代表红色、绿色和蓝色颜色代码。我想用“灰色”颜色过滤所有行,其中 R == G == B。这是我的代码:

    red <- c("30", "68", "28", "60", "90", "40", "10", "C8", "88", "38", 
  "08", "00", "D8", "20", "F8", "18", "B0", "F8", "A8", "F8", "F8", 
  "F8", "F8", "F8", "F8", "F8", "F8", "F8", "F8", "F8", "F8", "F8", 
  "F8", "F8", "F8", "F8", "F8", "D8", "F8", "F8", "E8", "F8", "B8", 
  "F8", "F8", "C8", "E8", "B0", "98", "E0", "F8", "F8", "78", "90", 
  "68", "A8", "D0", "88", "F8", "48", "F8", "60", "30", "80", "58", 
  "C0", "F8", "08", "28", "50", "00", "20", "A0", "00", "18", "70", 
  "00", "00", "00", "40", "F0", "70", "00", "00", "00", "00", "00", 
  "00", "F8", "F8", "F0", "F8", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00")

  green <- c("30", "68", "28", "60", "90", "40", "10", "C8", "88", "38", 
  "08", "00", "D8", "20", "28", "18", "B0", "08", "A8", "58", "20", 
  "70", "88", "38", "18", "50", "B0", "68", "98", "80", "48", "D0", 
  "A8", "10", "C8", "40", "E8", "F8", "78", "A0", "F8", "C0", "F8", 
  "E0", "30", "F8", "E8", "F8", "F8", "F8", "90", "D8", "F8", "F8", 
  "F8", "F8", "F8", "F8", "00", "F8", "B8", "F8", "F8", "F8", "F8", 
  "F8", "60", "F8", "F8", "F8", "F0", "F8", "F8", "E8", "F8", "F8", 
  "D8", "A8", "C8", "F8", "F8", "70", "80", "B8", "98", "68", "F8", 
  "48", "F8", "F0", "F0", "F8", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00")

  blue <- c("30", "68", "28", "60", "90", "40", "10", "C8", "88", "38", 
  "08", "00", "D8", "20", "00", "18", "B0", "00", "A8", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "E8", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "08", "00", "00", "10", "00", "00", 
  "20", "50", "30", "00", "00", "70", "78", "40", "60", "90", "00", 
  "B0", "00", "00", "F0", "F8", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", 
  "00", "00", "00", "00")

  RGB <- data.frame("R"=red, "G"=green, "B"=blue)
  grays <- subset(RGB,(R==G & R==B & G==B))

但在最后一个命令中我收到错误:Ops.factor(R, B) 中的错误:因子的水平集不同

我还尝试了子集命令:

grays2 <- RGB[(RGB$R==RGB$G & RGB$R==RGB$B & RGB$G==RGB$B),]

但它给了我同样的错误消息。

我在这里做错了什么吗?

最佳答案

如果您愿意尝试一下 data.table,代码会更短。仍然需要按照评论中的意见设置 stringsAsFactors=F 。

RGB <- data.frame("R"=red, "G"=green, "B"=blue, stringsAsFactors=F)
library(data.table)
setDT(RGB)  ## set data frame to data table
grays_dt <- RGB[c(R==G & R==B & G==B), ]  ## do the subsetting
grays_dt
#     R  G  B
# 1: 30 30 30
# 2: 68 68 68
# 3: 28 28 28
# 4: 60 60 60
# 5: 90 90 90
# ---         
# 181: 00 00 00
# 182: 00 00 00
# 183: 00 00 00
# 184: 00 00 00
# 185: 00 00 00

@Mark 的解决方案与此解决方案之间的区别在于,列类在基本解决方案中是 Factor,而在 data.table 解决方案中是 Character。

str(grays_dt)
# Classes ‘data.table’ and 'data.frame':  185 obs. of  3 variables:
# $ R: chr  "30" "68" "28" "60" ...
# $ G: chr  "30" "68" "28" "60" ...
# $ B: chr  "30" "68" "28" "60" ...
# - attr(*, ".internal.selfref")=<externalptr> 

str(grays)
# 'data.frame': 185 obs. of  3 variables:
# $ R: Factor w/ 21 levels "00","08","10",..: 7 11 6 10 14 9 3 17 13 8 ...
# $ G: Factor w/ 21 levels "00","08","10",..: 7 11 6 10 14 9 3 17 13 8 ...
# $ B: Factor w/ 21 levels "00","08","10",..: 7 11 6 10 14 9 3 17 13 8 ...

关于r - 在 R 中查找所有列都相等的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555566/

相关文章:

pandas - 有没有办法在忽略索引的同时水平连接相同长度的数据帧?

python - 将列表的值设置为数据帧列表

mysql - "foreach"循环 : Using all cores in R (especially if we are sending sql queries inside foreach loop)

r - 从上一个非 NA 值获取索引

r - 具有加权因变量的双向方差分析

javascript - 设置默认颜色而不弄乱页面

r - 如何用多边形突出显示时间序列预测的置信区域

php - 基于数字的颜色编码

c++ - 从 make 中突出显示 C/C++ 错误?

按组将缺失值 (NA) 替换为最新的非 NA