74 votes

Supprimer les lignes dont les valeurs sont vides dans une colonne particulière

Je travaille sur un grand ensemble de données, dont certaines lignes contiennent des NA et d'autres des blancs :

df <- data.frame(ID = c(1:7),                                   
         home_pc = c("","CB4 2DT", "NE5 7TH", "BY5 8IB", "DH4 6PB","MP9 7GH","KN4 5GH"),               
         start_pc = c(NA,"Home", "FC5 7YH","Home", "CB3 5TH", "BV6 5PB",NA),               
         end_pc = c(NA,"CB5 4FG","Home","","Home","",NA))

Comment supprimer les NA et les blancs en une seule fois (dans les colonnes start_pc et end_pc) ? Dans le passé, j'ai utilisé :

df<- df[-which(is.na(df$start_pc)), ]

... pour supprimer les NA - existe-t-il une commande similaire pour supprimer les blancs ?

102voto

sgibb Points 11908
 df[!(is.na(df$start_pc) | df$start_pc==""), ]

5 votes

| est un opérateur ou et ! inverse. Par conséquent, la commande affiche toutes les lignes, qui sont no b) NA ou b) égal à "".

1 votes

Ce code ne supprimerait-il pas des lignes entières, au lieu de les consolider en supprimant les valeurs vides ?

1 votes

C'est ce que j'ai trouvé qui fonctionne aussi bien. J'avais un ensemble de données pour lequel je voulais supprimer les lignes pour lesquelles il manquait des données dans la colonne. En exécutant cette opération avec mon propre cadre de données et en assignant la valeur au nouveau cadre de données, j'ai obtenu ce que j'attendais.

30voto

Andrie Points 66979

Il s'agit de la même construction - il suffit de tester les chaînes vides au lieu de NA :

Essayez ça :

df <- df[-which(df$start_pc == ""), ]

En fait, en regardant votre code, vous n'avez pas besoin de l'élément which mais utilisez la négation à la place, de sorte que vous pouvez le simplifier en :

df <- df[!(df$start_pc == ""), ]
df <- df[!is.na(df$start_pc), ]

Et, bien sûr, vous pouvez combiner ces deux déclarations comme suit :

df <- df[!(df$start_pc == "" | is.na(df$start_pc)), ]

Et simplifiez-le encore plus avec with :

df <- with(df, df[!(start_pc == "" | is.na(start_pc)), ])

Vous pouvez également tester une longueur de chaîne non nulle en utilisant nzchar .

df <- with(df, df[!(nzchar(start_pc) | is.na(start_pc)), ])

Disclaimer : Je n'ai pas testé ce code. Veuillez me faire savoir s'il y a des erreurs de syntaxe quelque part.

1 votes

@richiecotton Merci pour la modification. nzchar est un moyen astucieux de tester une longueur non nulle, et je ne le connaissais pas.

0 votes

Aucune de ces solutions ne fonctionne dans mon cas ! df<-structure(list(vars = structure(1:5, .Label = c("a", "b", "v", "d", "e", "s", "ds"), class = "factor"), '1' = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), '2' = c(NA, 0.9, NA, NA, NA), '3' = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), .Names = c("vars", "1", "2", "3"), row.names = c(NA, 5L), class = "data.frame")

18voto

Agile Bean Points 417

Une solution élégante avec dplyr serait :

df %>%
  # recode empty strings "" by NAs
  na_if("") %>%
  # remove NAs
  na.omit

2 votes

Solution très élégante et simple :)

7voto

user6164045 Points 61

Une solution alternative peut être de supprimer les lignes avec des blancs dans une variable :

df <- subset(df, VAR != "")

1 votes

Bienvenue à Stack Overflow ! Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure les parties essentielles de la réponse ici, et de fournir le lien pour référence.

7voto

user6074085 Points 41

Une approche facile serait de rendre toutes les cellules vides NA et ne garder que les cas complets. Vous pouvez également rechercher na.omit des exemples. Il s'agit d'un sujet largement débattu.

df[df==""]<-NA
df<-df[complete.cases(df),]

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