J'écris une fonction qui nécessite de vérifier si (et quelle!) Colonne (variable) a toutes les valeurs manquantes (NA
, <NA>
). Ce qui suit est un fragment de la fonction:
test1 <- data.frame (matrix(c(1,2,3,NA,2,3,NA,NA,2), 3,3))
test2 <- data.frame (matrix(c(1,2,3,NA,NA,NA,NA,NA,2), 3,3))
na.test <- function (data) {
if (colSums(!is.na(data) == 0)){
stop ("The some variable in the dataset has all missing value,
remove the column to proceed")
}
}
na.test (test1)
Warning message:
In if (colSums(!is.na(data) == 0)) { :
the condition has length > 1 and only the first element will be used
Q1: Pourquoi l'erreur ci-dessus et des correctifs?
Q2: Est-il possible de trouver laquelle des colonnes a toutes les NA
, par exemple la liste (nom de la variable ou numéro de colonne)?
C'est assez facile avec avec sapply
et une petite fonction anonyme:
sapply(test1, function(x)all(is.na(x)))
X1 X2 X3
FALSE FALSE FALSE
sapply(test2, function(x)all(is.na(x)))
X1 X2 X3
FALSE TRUE FALSE
Et à l'intérieur d'une fonction:
na.test <- function (x) {
w <- sapply(x, function(x)all(is.na(x)))
if (any(w)) {
stop(paste("All NA in columns", paste(which(w), collapse=", ")))
}
}
na.test(test1)
na.test(test2)
Error in na.test(test2) : All NA in columns 2
En dplyr
ColNums_NotAllMissing <- function(df){ # helper function
as.vector(which(colSums(is.na(df)) != nrow(df)))
}
df %>%
select(ColNums_NotAllMissing(.))
example:
x <- data.frame(x = c(NA, NA, NA), y = c(1, 2, NA), z = c(5, 6, 7))
x %>%
select(ColNums_NotAllMissing(.))
ou l'inverse
Cols_AllMissing <- function(df){ # helper function
as.vector(which(colSums(is.na(df)) == nrow(df)))
}
x %>%
select(-Cols_AllMissing(.))
Pour trouver les colonnes avec toutes les valeurs manquantes
allmisscols <- apply(dataset,2, function(x)all(is.na(x)));
colswithallmiss <-names(allmisscols[allmisscols>0]);
print("the columns with all values missing");
print(colswithallmiss);
Pour vérifier si les colonnes ont toutes les valeurs manquantes:
apply(test1,2,function(x) {all(is.na(x))})
Pour savoir quelles colonnes ont toutes les valeurs manquantes:
test1.nona <- test1[ , colSums(is.na(test1)) == 0]
La commande suivante vous donne une table Nice avec les colonnes qui ont des valeurs NA:
sapply(dataframe, function(x)all(any(is.na(x))))
C'est une amélioration pour votre première réponse, qui ne fonctionne pas correctement dans certains cas.