2017-10-17 1 views
3

Supposons que j'ai un vecteur de personnage nommé comme ceci:valeur Obtenir de l'élément vecteur de personnage nommé lorsque le nom est 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" 

où les noms sont ID et les valeurs des couleurs. Si je donne un ID au vecteur colors, j'obtiens la couleur correspondante.

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

Cependant, pour un cas où le nom est <NA>, je ne sais pas comment je peux retourner la couleur correspondante. Fournir simplement NA ne fonctionne pas

> 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 

Des suggestions?

+4

Peut-être 'colors [is.na (noms (couleurs))]'? Je ne sais vraiment pas. –

+2

Définir "ne fonctionne pas". Quelle sortie attendez-vous? –

+0

Ne fonctionne pas comme dans ne retourne pas la couleur correspondante. Je pense que c'est assez clair. Mais @RuiBarradas ça marche! Merci beaucoup. S'il vous plaît écrivez-le comme une réponse afin que je puisse accepter. –

Répondre

0

Depuis colors est déjà le nom d'une fonction base R, je vais créer un vecteur x.

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

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

"Puisque les couleurs sont déjà le nom d'une fonction R de base", cela n'a aucune importance. L'ombrage des noms est fréquent et sans problème. N'essayez pas de l'éviter, cela conduit à des noms compliqués et artificiels. –

+0

@KonradRudolph Je ne suis pas d'accord. J'ai plusieurs fois des problèmes avec l'utilisation des fonctions de base R comme noms de variables. Surtout, 'c', nécessitant' get (c) ', mais aussi d'autres. –

+0

Vous n'avez pas besoin (et vous ne devriez pas utiliser) 'get ('c')' (cela ne fonctionnerait pas, vous auriez besoin de 'get ('c', envir = baseenv())' ou quelque chose de similaire) . Vous utilisez 'base :: c'. C'est ce que les espaces de noms * sont pour *. Cela dit, ombrer 'c' dans une portée où' base :: c' est aussi nécessaire peut en effet être mal avisé. Mais en général, tout va bien: vous ne pouvez sérieusement envisager d'interdire les noms généraux tels que 'colors',' plot' etc. de toute votre base de code. –

0

Cela devrait fonctionner, mais retournerait plusieurs valeurs si plusieurs couleurs n'ont pas de noms.

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

Pas besoin de 'which'. C'est redondant. –