web-dev-qa-db-fra.com

Comment puis-je 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 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 
175
R newbie

L'idée principale 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'appelle myData:

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

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

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

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

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

Notez que l’opérateur ! agit comme un NOT, c.-à-d. !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. où une valeur de 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 intéressante consiste à utiliser ce type de sous-ensemble non seulement pour l'extraction, mais également pour l'affectation:

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

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

68
Paul Hiemstra

Problèmes de suppression par numéro de ligne

Pour des analyses rapides et imprécises, vous pouvez supprimer les 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), ] 

Toutefois, 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 dans vos données peut changer dans le futur. Un principe général d'un data.frame ou d'une table de base de données est que l'ordre des lignes ne devrait pas avoir d'importance. Si la commande est importante, elle devrait être codée dans une variable réelle dans le fichier data.frame.

Par exemple, imaginons que vous importiez un jeu de données et supprimiez des lignes par position numérique après avoir inspecté les données et identifié les numéros de ligne des lignes à supprimer. Cependant, à un moment ultérieur, vous allez consulter les données brutes, les réorganiser. Votre code de suppression de ligne supprimera maintenant les mauvaises lignes et, pire encore, il est peu probable que vous rencontriez des erreurs vous avertissant que cela s'est produit.

Meilleure stratégie

Une meilleure stratégie consiste à supprimer les lignes en fonction de leurs propriétés essentielles et stables. Par exemple, si vous aviez une variable de colonne id qui identifie de manière unique chaque cas, vous pouvez l'utiliser.

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

D'autres fois, vous aurez un critère formel d'exclusion qui pourrait être spécifié et vous pouvez utiliser l'un des nombreux outils de sous-définition de R pour exclure les cas basés sur cette règle. 

44
Jeromy Anglim

Créez une colonne id dans votre cadre de données ou utilisez un nom de colonne pour identifier la ligne. L'utilisation de l'index n'est pas juste à supprimer. 

Utilisez la fonction 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)

Par séquence simplifiée:

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

Par séquence:

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

Par ordre négatif:

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

Ou si vous souhaitez créer un sous-ensemble en sélectionnant des nombres impairs:

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

Ou si vous souhaitez créer un sous-ensemble en sélectionnant des nombres impairs, version 2:

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

Ou si vous souhaitez créer un sous-ensemble en filtrant les nombres pairs:

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

Ou si vous souhaitez sous-définir en filtrant les nombres pairs, version 2:

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
5
Elías De La Rosa

Supprimer Dan de employee.data - Pas besoin de gérer un nouveau data.frame.

employee.data <- subset(employee.data, name!="Dan")
0
SQLWolfe

Voici une fonction rapide et incorrecte pour supprimer une ligne par index.

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

Son principal défaut est que l'argument row_index ne suit pas le modèle R qui consiste à ê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 que ces dernières semaines. Tous commentaires et améliorations à ce sujet seraient les bienvenus!

0
Alan Carlyle