J'ai un bloc de données nommé "mes données" 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 la ligne 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
Réponses:
L'idée clé est de former un ensemble de lignes que vous souhaitez supprimer et de conserver le complément de cet ensemble.
Dans R, le complément d'un ensemble est donné par l'opérateur '-'.
Donc, en supposant que le
data.frame
s'appellemyData
:Bien sûr, n'oubliez pas de "réaffecter"
myData
si vous souhaitez supprimer entièrement ces lignes --- sinon, R imprime simplement les résultats.la source
,
dedans! ;)drop = FALSE
y un.-
cela ne fonctionnera pas, car l'opérateur complémentaire pour les logiques est!
. Le complément de c (2,4,6) dans les rangées serait plutôt setdiff (c (2,4,6), 1: nrow (myData)), qui n'est pas c (-2, -4, -6) , bien que les deux produisent les mêmes lignes lorsqu'ils sont utilisés avec[
.myData[-c(2, 4, 6),,drop=F]
. En fait, je suggère que vous insériez toujours,drop=F
juste avant le]
dans n'importe quel accès matriciel.Vous pouvez également travailler avec un soi-disant vecteur booléen, alias
logical
:Notez que l'
!
opérateur agit comme un NOT, c'est!TRUE == FALSE
-à- dire :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 lorsqu'une valeur de colonne dépasse une certaine valeur:
Vous pouvez transformer un vecteur booléen en un vecteur d'indices:
Enfin, une astuce très intéressante est que vous pouvez utiliser ce type de sous-ensemble non seulement pour l'extraction, mais aussi pour l'affectation:
où la colonne
A
est attribuéeNA
(pas un nombre) oùA
dépasse 4.la source
Problèmes de suppression par numéro de ligne
Pour des analyses rapides et sales, vous pouvez supprimer des lignes d'un data.frame par numéro selon la première réponse. C'est à dire,
Cependant, si vous essayez d'écrire un script d'analyse de données robuste, vous devez 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'une table data.frame ou d'une table de base de données est que l'ordre des lignes ne devrait pas avoir d'importance. Si l'ordre importe, cela doit être encodé dans une variable réelle dans le data.frame.
Par exemple, imaginez que vous avez importé un jeu de données et supprimé des lignes par position numérique après avoir inspecté les données et identifié les numéros de ligne des lignes que vous souhaitez supprimer. Cependant, à un moment ultérieur, vous allez dans les données brutes et regardez autour de vous et réorganisez les données. Votre code de suppression de ligne supprimera désormais les lignes incorrectes et, pire encore, il est peu probable que des erreurs vous avertissent que cela s'est produit.
Meilleure stratégie
Une meilleure stratégie consiste à supprimer des lignes en fonction des propriétés substantielles et stables de la ligne. Par exemple, si vous aviez une
id
variable de colonne qui identifie de manière unique chaque cas, vous pouvez l'utiliser.D'autres fois, vous aurez un critère d'exclusion formel qui pourrait être spécifié et vous pourriez utiliser l'un des nombreux outils de sous-ensemble dans R pour exclure les cas basés sur cette règle.
la source
Créez une colonne id dans votre bloc de données ou utilisez n'importe quel nom de colonne pour identifier la ligne. L'utilisation de l'index n'est pas juste à supprimer.
Utilisez la
subset
fonction pour créer un nouveau cadre.la source
Par séquence simplifiée:
Par séquence:
Par séquence négative:
Ou si vous souhaitez sous-ensemble en sélectionnant des nombres impairs:
Ou si vous souhaitez sous-ensemble en sélectionnant des nombres impairs, version 2:
Ou si vous souhaitez sous-ensemble en filtrant les nombres pairs:
Ou si vous souhaitez sous-ensemble en filtrant les nombres pairs, la version 2:
la source
Supprimer Dan de employee.data - Pas besoin de gérer un nouveau data.frame.
la source
Voici une fonction rapide et sale pour supprimer une ligne par index.
Son principal défaut est que l'argument row_index ne suit pas le modèle R d'être un vecteur de valeurs. Il peut y avoir d'autres problèmes car je n'ai passé que quelques minutes à l'écrire et à le tester, et je n'ai commencé à utiliser R qu'au cours des dernières semaines. Tous les commentaires et améliorations à ce sujet seraient les bienvenus!
la source
Pour être complet, j'ajouterai que cela peut aussi être fait
dplyr
en utilisantslice
. L'avantage de l'utiliser est qu'il peut faire partie d'un flux de travail canalisé.Bien sûr, vous pouvez également l'utiliser sans tuyaux.
Le format "non vectoriel",
-c(2, 4, 6)
signifie obtenir tout ce qui n'est pas aux lignes 2, 4 et 6. Pour un exemple utilisant une plage, disons que vous vouliez supprimer les 5 premières lignes, vous pourriez le faireslice(df, 6:n())
. Pour plus d'exemples, consultez la documentation .la source