2010-09-28 9 views
0

J'ai une seule colonne dans une trame de données en R qui ressemble à ceci:Suppression d'une catégorie particulière d'une trame de données en R

blue 
green 
blue 
yellow 
black 
blue 
green 

Comment puis-je supprimer toutes les lignes qui indiquent bleu? S'il vous plaît gardez à l'esprit que je ne veux pas une valeur NULL représentée dans cette ligne: Je veux que la ligne entière soit supprimée.

Merci :)

+3

Pouvez- vous nous donner dput (tête (DFRAME, n = 5))? Je sais que c'est terriblement verbeux, mais faites-le de toute façon. commenter "vous avez encore des problèmes" sans aucune autre information, il est impossible de vous aider. –

Répondre

5

Faites également attention à la différence entre une variable de facteur et vecteur de caractères. Par défaut, les facteurs conservent tous les niveaux d'origine sauf si vous réaffectez le vecteur modifié en tant que nouveau facteur ou si vous utilisez l'une des fonctions de mise à jour.

> DF <- data.frame(v = factor(c("red", "blue", "green", "blue"))) 
> summary(DF) 
    v  
blue :2 
green:1 
red :1 
> summary(DF[ DF$v != "blue", , drop=FALSE]) 
    v  
blue :0 
green:1 
red :1 
> DF <- DF[ DF$v != "blue", , drop=FALSE]; DF$v <- factor(DF$v); summary(DF) 
    v  
green:1 
red :1 
> 
+1

Si vous ne voulez pas ce comportement, vous ne devriez pas utiliser un facteur. – hadley

+0

Je ne suis pas d'opinion particulière ici: j'aime les facteurs. Je fournis simplement une assistance à ce qui semble être un nouvel utilisateur - car ceux-ci sont les plus susceptibles de tomber dans le piège fourni par la valeur par défaut de R de 'stringsAsFavtors'. –

-1
> Data[Data!="blue"] 
[1] "green" "yellow" "black" "green" 

ou

> Data[which(Data!="blue",TRUE)] 
[1] "green" "yellow" "black" "green" 

Modifier pour répondre au commentaire de Joris (cela fonctionne pour data.frames 1-colonne):

> str(Data) 
'data.frame': 7 obs. of 1 variable: 
$ V1: Factor w/ 4 levels "black","blue",..: 2 3 2 4 1 2 3 
+1

C'est pour un vecteur, ne fonctionne pas avec une base de données. Ajouter une virgule après "bleu" et oublier l'option which(), je ne peux pas penser à une raison pour laquelle on utiliserait une fonction supplémentaire s'il n'y en a absolument pas besoin. –

+0

Merci Joshua. Je suppose que les données est le nom de la trame de données, correct? J'ai essayé cela, mais tout ce qu'il fait est d'imprimer mon cadre de données. Voici ce que j'ai entré: datafr [qui (datafr! = "ScreenSaverEngine", TRUE)] J'ai remplacé Data avec le nom de mon cadre de données qui est 'datafr' –

+0

Joris et Joshua ... Je suis encore un peu confus. J'ai ajouté la virgule comme ceci: datafr [datafr! = "ScreenSaverEngine,"]. datafr est mon dataframe et ScreenSaverEngine sont les lignes dont je veux me débarrasser. –

2

Qu'est-ce que à propos de

> df1 = data.frame(a=c("Red", "Blue", "Red"), b=1:3) 
> df1[df1$a!= "Blue",] 
    a b 
1 Red 1 
3 Red 3 
+0

Merci csgillespie Mais malheureusement, j'ai toujours des problèmes, c'est ce que j'ai saisi: datafr [datafr $ "FOCUS.APP"! = "ScreenSaverEngine",] datafr est ma trame de données; FOCUS.APP est le nom de la colonne; ScreenSaverEngine est le nom des lignes que je veux éliminer –

+0

@Eric: Vous devez supprimer le "" autour de FOCUS.APP. Veuillez être un peu plus ponctuel dans la copie du code, vous semblez faire ces erreurs régulièrement Avez-vous déjà parcouru le guide R d'Owen et l'introduction à R? –

+0

@Joris: J'ai essayé un cas de test avec "" autour de FOCUS.APP et cela a fonctionné – csgillespie

2

Si tous les crochets et les virgules et les signes dollar vous confondez, alors pourquoi ne pas essayer 'sous-ensemble':

> d=data.frame(a=c("Red", "Blue", "Red"), b=1:3) 
> subset(d,a!="Blue") 
    a b 
1 Red 1 
3 Red 3 
+1

Est-ce que le sous-ensemble refactorise la variable pour se débarrasser des niveaux vides ou reste-t-il les niveaux vides? Que serait-il arrivé si l'on était entré dans le tableau (a) après? – Farrel

+0

Comme le suggère Farrel, cela ne supprime pas réellement le niveau vide. – Xodarap