web-dev-qa-db-fra.com

Supprimer les lignes avec des valeurs vides dans une colonne particulière

Je travaille sur un grand ensemble de données, avec certaines lignes avec des NA et d'autres avec 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 puis-je supprimer les NA et les blancs en une fois (dans les colonnes start_pc et end_pc)? J'ai utilisé dans le passé:

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

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

51
KT_1
 df[!(is.na(df$start_pc) | df$start_pc==""), ]
70
sgibb

C'est la même construction - testez simplement les chaînes vides plutôt que NA:

Essaye ça:

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

En fait, en regardant votre code, vous n'avez pas besoin de which, mais utilisez plutôt la négation, vous pouvez donc le simplifier:

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)), ])

Avertissement: je n'ai testé aucun de ce code. Merci de me prévenir s'il existe des erreurs de syntaxe

23
Andrie

Une approche simple consisterait à rendre toutes les cellules vides NA et à ne conserver que les cas complets. Vous pouvez également rechercher des exemples na.omit. C'est un sujet largement discuté.

df [df == ""] <- NA

df <-df [complete.cases (df),]

4
user6074085

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

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

Une solution élégante avec dplyr serait:

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