如何识别2个字符向量的组合作为预定义向量的名称

时间:2014-07-30 13:23:41

标签: r vector character

R初学者,所以提前感谢您的耐心等待!

我正在尝试执行某项操作而我并不认为我在R中使用了正确的方法。

总结一下下面写的内容 - 我希望R识别2个字符向量的组合作为预定义向量的名称。

我的数据集是:

Color <- c("Red", "Red", "Blue", "Yellow", "Green")
Shade <- c("Burgundy", "Charcoal", "Azur", "Mustard", "Navy")
dataset <- data.frame(Color, Shade)

我为&#34; Redshades&#34;,&#34; Blueshades&#34;预设了矢量图。等,以考虑所有颜色的颜色。例如:

Redshades <- c("Burgundy", "Crimson", "Scarlet")

现在,我想通过数据集的每一行,并确定阴影是否与同一行的颜色相对应。

我的方法是在第1列中使用颜色的名称,添加&#34;阴影&#34;对应于包含阴影名称的相关向量的名称,然后计算它是否正确

col <- c(dataset$Color[1],"Shades", sep="")

问题在于&#34; col&#34;返回一个字符,而不是矢量名称(已存在)。使用as.name()或noquote()并没有帮助。

我接受我可能会偏离目标,对任何建议持开放态度.....我已经花了一段时间在stackoverflow和google上搜索但无济于事.......

3 个答案:

答案 0 :(得分:2)

这是一个基础R方法,您可以将阴影向量存储在列表中(我称之为shadeslst)。

Redshades <- c("Burgundy", "Crimson", "Scarlet")
Blueshades <- c("Azur", "Navy")
# add more shades ...

# store them in a list
shadeslst <- list(Red = Redshades, Blue = Blueshades)

shadeslst
#$Red
#[1] "Burgundy" "Crimson"  "Scarlet" 
#
#$Blue
#[1] "Azur" "Navy"

现在使用sapply检查它们是否在等效的列表元素中:

dataset$check <- sapply(seq_len(nrow(dataset)), function(idx) with(dataset, Shade[idx] %in% shadeslst[[as.character(Color[idx])]]))

请注意,列表名称必须与dataset$Color中的颜色名称相对应才能生效。

dataset
#   Color    Shade check
#1    Red Burgundy  TRUE
#2    Red Charcoal FALSE
#3   Blue     Azur  TRUE
#4 Yellow  Mustard FALSE
#5  Green     Navy FALSE

答案 1 :(得分:1)

如果您按照@beginneR的建议在列表shadeslst中存储不同的阴影,您也可以这样做:

 library(qdap)
 library(reshape2) 
 dataset$check <- paste2(dataset) %in% paste2(melt(shadeslst)[,2:1])
 #instead of paste2 from qdap, you could use as.character(interaction(dataset))
 dataset
 #   Color    Shade check
 #1    Red Burgundy  TRUE
 #2    Red Charcoal FALSE
 #3   Blue     Azur  TRUE
 #4 Yellow  Mustard FALSE
 #5  Green     Navy FALSE

答案 2 :(得分:0)

如果我正确理解了您的问题,请验证所有红色阴影的行是否正确标记为红色。所有的蓝色阴影都是蓝色等。第一步是确定哪些行属于某个阴影。使用Redshades示例,这可以通过以下方式完成;

is.red.shade <- dataset$Shade %in% Redshades

这将返回一个逻辑向量,随后可用于索引数据集的第一列。

dataset$Color[is.red.shade]

在这种情况下,您只返回了一个值,因此您可以立即看到它是正确的。如果这返回的矢量太长而无法直观检查,则可以通过

检查所有值是否为红色
all(dataset$Color[is.red.shade] == "Red")

希望这会解决您的问题,如果不是这样,请告诉我。