web-dev-qa-db-fra.com

Comment supprimer des lignes avec inf d'un fichier de données dans R

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 

18
Eka

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.

22
RHertel

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)

les données

set.seed(24)
df <- as.data.frame(matrix(sample(c(1:5, NA, -Inf, Inf), 
                      20*5, replace=TRUE), ncol=5))
5
akrun

Pour garder les lignes sans Inf nous pouvons faire:

df[apply(df, 1, function(x) all(is.finite(x))), ]

De même, NAs 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
4
jogo

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")
0
Lauren Woodward