2017-10-17 53 views
3

假设我有一个命名字符向量是这样的:获得价值时的名字是NA

> class(colors) 
[1] "character" 

> colors 
     9074  8778  8577  7148  <NA>  3310  0050169  8893  50156  9008  9778 
"#FF0000FF" "#FF7600FF" "#FFEB00FF" "#9DFF00FF" "#27FF00FF" "#00FF4EFF" "#00FFC4FF" "#00C4FFFF" "#004EFFFF" "#2700FFFF" "#9D00FFFF" 
     5295  0080162 
"#FF00EBFF" "#FF0076FF" 

其中姓名是ID和值是颜色。如果我给colors矢量一个ID,我会得到相应的颜色。

> colors["9074"] 
     9074 
"#FF0000FF" 

然而,对于其中名称是<NA>的一个情况下,我不知道我怎么能返回相应的颜色。简单提供NA不起作用

> colors[NA] 
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
    NA NA NA NA NA NA NA NA NA NA NA NA NA 

> colors["NA"] 
<NA> 
    NA 

有什么建议吗?

+4

也许'colors [is.na(names(colors))]'?我真的不知道。 –

+2

定义“不起作用”。你期待什么输出? –

+0

不工作,因为在不返回相应的颜色。我认为这很清楚。但@RuiBarradas的作品!非常感谢。请把它写成答案,以便我可以接受。 –

回答

0

由于colors已经是base R函数的名字,我将创建一个矢量x

x <- 1:5 
names(x) <- c("A", "B", NA, "D", "E") 

x[is.na(names(x))] 
#<NA> 
# 3 
+1

“由于颜色已经是基本R函数的名称” - 这是非常不相关的。名字遮蔽是频繁且毫无问题的。不要试图避免它,它会导致错综复杂的虚假名称。 –

+0

@KonradRudolph我不同意。我有很多次使用基本R函数作为变量名称的问题。最重要的是,'c',需要'get(c)',而且还需要其他人。 –

+0

你不需要(也不应该使用)get('c')'(它也行不通,你需要get('c',envir = baseenv())或类似的东西) 。你使用'base :: c'。这是*的命名空间*。也就是说,在需要'base :: c'的范围内映射'c'可能确实是不明智的。但总体来说它很好:你不能认真考虑从你的整个代码库中禁止一般的名字,比如'colors','plot'等等。 –

0

这应该工作,但如果多个颜色没有名称将返回多个值。

colors[which(is.na(names(colors)))] 
+0

不需要'哪个'。这是多余的。 –