2010-11-24 11 views
4

J'ai un ensemble de données U1 sur laquelle je lance un classificateur et obtenir un vecteur d'étiquettesNouveau sous-ensemble en sélectionnant des lignes en fonction des valeurs d'un vecteur dans R

pred.U1.nb.c <- predict(NB.C, U1[,2:6]) 
table(pred.U1.nb.c) 
pred.U1.nb.c 
    S unlabeled 
    148  5852 
> head(pred.U1.nb.c) 
    [1] S S S S S S 
    Levels: S unlabeled 

Maintenant, je veux tirer les lignes de U1 qui ont été classés comme S dans U1.S. Quel est le moyen le plus efficace de le faire?

Répondre

11

La réponse de James a élégante économie va pour elle et aurait certainement fonctionner correctement avec cet exemple, mais elle est sujette à des résultats indésirables si le vecteur testé a une NA de. (Je l'ai été mordu à plusieurs reprises et été perplexe.) Voici deux façons plus sûres qui évitent le NA comportement en tout-inclus de la « [ » fonction:

U1[which(pred.U1.nb.c=="S"), ] 

Ceci convertit le vecteur logique (peut-être avec NA de) dans un vecteur numérique sans NA. On peut aussi utiliser sous-ensemble:

subset(U1 ,pred.U1.nb.c=="S") 

EDIT: Je pense que l'utilisation Grepl permettrait également d'éviter la préoccupation NA. Peut-être:

U1[grepl("^S$", pred.U1.nb.c), ] 
+1

'U1 [pred.U1.nb.c% in%" S ",]' fonctionnera aussi et si je me souviens peut être plus rapide que 'which'. – Marek

+0

Droite. J'ai vu des timings qui ont montré que% en% était étonnamment rapide. La stratégie 'which()' peut gérer une plus grande variété d'inégalités et de fonctions renvoyant des logiques. –

3
U1[pred.U1.nb.c=="S",]