J'ai une très grande base de données (df) avec environ 35 à 45 colonnes (variables) et des lignes supérieures à 300. Certaines lignes contiennent des valeurs NA, NaN, Inf, -Inf dans des variables uniques ou multiples, et j'ai used na.omit(df)
pour supprimer les lignes avec NA et NaN mais je ne peux pas supprimer les lignes avec les valeurs Inf et -Inf à l'aide de la fonction na.omit.
En cherchant, je suis tombé sur ce fil Supprimer les lignes avec Inf et NaN dans R et utiliser le code modifié df[is.finite(df)]
mais ne supprime pas les lignes avec Inf et -Inf et donne également cette erreur
Erreur dans is.finite (df): méthode par défaut non implémentée pour le type 'liste'
ÉDITÉ
Supprime la ligne entière même la ou les colonnes correspondantes ont inf et -inf
Pour supprimer les lignes avec +/-Inf
, je suggère ce qui suit:
df <- df[!is.infinite(rowSums(df)),]
ou équivalent,
df <- df[is.finite(rowSums(df)),]
La deuxième option (celle avec is.finite()
et sans la négation) supprime également les lignes contenant les valeurs NA
au cas où cela n’aurait pas déjà été fait.
Le is.finite
fonctionne sur vector
et non sur un objet data.frame
. Nous pouvons donc parcourir le data.frame
en utilisant lapply
et obtenir uniquement les valeurs «finies».
lapply(df, function(x) x[is.finite(x)])
Si le nombre de valeurs Inf
, -Inf
est différent pour chaque colonne, le code ci-dessus aura une list
avec des éléments ayant une variable length
inégale. Donc, il peut être préférable de le laisser comme une list
. Si nous voulons un data.frame
, il devrait avoir la même longueur.
Si nous voulons supprimer des lignes contenant des valeurs NA ou Inf/-Inf
df[Reduce(`&`, lapply(df, function(x) !is.na(x) & is.finite(x))),]
Ou une option compacte de @nicola
df[Reduce(`&`, lapply(df, is.finite)),]
Si nous sommes prêts à utiliser un paquet, une option compacte serait NaRV.omit
library(IDPmisc)
NaRV.omit(df)
set.seed(24)
df <- as.data.frame(matrix(sample(c(1:5, NA, -Inf, Inf),
20*5, replace=TRUE), ncol=5))
Pour garder les lignes sans Inf
nous pouvons faire:
df[apply(df, 1, function(x) all(is.finite(x))), ]
De même, NA
s est traité par ceci à cause de:
un rowindex avec la valeur NA
supprimera cette ligne dans le résultat.
De plus, les lignes avec NaN
ne sont pas dans le résultat.
set.seed(24)
df <- as.data.frame(matrix(sample(c(0:9, NA, -Inf, Inf, NaN), 20*5, replace=TRUE), ncol=5))
df2 <- df[apply(df, 1, function(x) all(is.finite(x))), ]
Voici les résultats des différentes fonctions is.~
-:
x <- c(42, NA, NaN, Inf)
is.finite(x)
# [1] TRUE FALSE FALSE FALSE
is.na(x)
# [1] FALSE TRUE TRUE FALSE
is.nan(x)
# [1] FALSE FALSE TRUE FALSE
J'ai eu ce problème et aucune des solutions ci-dessus n'a fonctionné pour moi. J'ai utilisé ce qui suit pour supprimer les lignes avec +/- Inf dans les colonnes 15 et 16 de mon cadre de données.
d<-subset(c, c[,15:16]!="-Inf")
e<-subset(d, d[,15:16]!="Inf")