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?
df[!(is.na(df$start_pc) | df$start_pc==""), ]
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
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),]
La solution alternative peut être de supprimer les lignes avec des blancs dans une variable:
df <- subset(df, VAR != "")
Une solution élégante avec dplyr serait:
df %>%
# recode empty strings "" by NAs
na_if("") %>%
# remove NAs
na.omit