305 votes

Comment supprimer des lignes dans un cadre de données ?

J'ai un cadre de données nommé "mydata" qui ressemble à ceci :

   A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4 

Je voudrais supprimer les lignes 2,4,6. Par exemple, comme ceci :

   A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4

459voto

Ananda Mahto Points 67213

L'idée principale est de former un ensemble de lignes à supprimer et de conserver le complément de cet ensemble.

Dans R, le complément d'un ensemble est donné par l'opérateur "-".

Ainsi, en supposant que le data.frame est appelé myData :

myData[-c(2, 4, 6), ]   # notice the -

Bien entendu, n'oubliez pas de "réaffecter" myData si vous souhaitez supprimer entièrement ces lignes - sinon, R affiche simplement les résultats.

myData <- myData[-c(2, 4, 6), ]

102voto

Paul Hiemstra Points 28390

Vous pouvez également travailler avec un vecteur dit booléen, alias logical :

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

Il convient de noter que le ! agit comme un NOT, c'est-à-dire que !TRUE == FALSE :

myData = myData[!row_to_keep,]

Cela semble un peu lourd par rapport à la réponse de @mrwab (+1 btw :)), mais un vecteur logique peut être généré à la volée, par exemple lorsque la valeur d'une colonne dépasse une certaine valeur :

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

Vous pouvez transformer un vecteur booléen en un vecteur d'indices :

row_to_keep = which(myData$A > 4)

Enfin, une astuce très intéressante consiste à utiliser ce type de sous-ensemble non seulement pour l'extraction, mais aussi pour l'affectation :

myData$A[myData$A > 4,] <- NA

où la colonne A est attribué NA (pas un nombre) où A dépasse 4.

81voto

Jeromy Anglim Points 8325

Problèmes liés à la suppression par numéro de ligne

Pour des analyses rapides, vous pouvez supprimer des lignes d'un data.frame par numéro, comme indiqué dans la première réponse. C'est-à-dire

newdata <- myData[-c(2, 4, 6), ] 

Cependant, si vous essayez d'écrire un script d'analyse de données robuste, vous devriez généralement éviter de supprimer des lignes par position numérique. En effet, l'ordre des lignes de vos données peut changer à l'avenir. Un principe général d'un data.frame ou d'une base de données est que l'ordre des lignes ne doit pas avoir d'importance. Si l'ordre a de l'importance, il doit être codé dans une variable réelle du data.frame.

Par exemple, imaginez que vous ayez importé un ensemble de données et supprimé des lignes par position numérique après avoir inspecté les données et identifié les numéros des lignes que vous souhaitiez supprimer. Cependant, à un moment donné, vous accédez aux données brutes, vous les examinez et vous les réorganisez. Votre code de suppression de lignes supprimera alors les mauvaises lignes et, pire encore, il est peu probable que vous obteniez des erreurs vous avertissant de cette situation.

Une meilleure stratégie

Une meilleure stratégie consiste à supprimer les lignes sur la base de leurs propriétés substantielles et stables. Par exemple, si vous avez un id qui identifie chaque cas de manière unique, vous pouvez l'utiliser.

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

Dans d'autres cas, vous disposerez d'un critère d'exclusion formel qui pourra être spécifié, et vous pourrez utiliser l'un des nombreux outils de sous-ensemble de R pour exclure des cas sur la base de cette règle.

15voto

Créez la colonne id dans votre cadre de données ou utilisez n'importe quel nom de colonne pour identifier la ligne. L'utilisation d'un index n'est pas juste pour la suppression.

Utilisation subset pour créer un nouveau cadre.

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)

12voto

Elías De La Rosa Points 302

Par séquence simplifiée :

mydata[-(1:3 * 2), ]

Par séquence :

mydata[seq(1, nrow(mydata), by = 2) , ]

Par séquence négative :

mydata[-seq(2, nrow(mydata), by = 2) , ]

Ou si vous voulez faire un sous-ensemble en sélectionnant les nombres impairs :

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

Ou si vous voulez faire un sous-ensemble en sélectionnant les nombres impairs, version 2 :

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

Ou si vous voulez faire un sous-ensemble en filtrant les nombres pairs :

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

Ou si vous voulez faire un sous-ensemble en filtrant les nombres pairs, la version 2 :

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X