J'ai un dataframe avec quelques colonnes numériques. Certaines lignes ont une valeur 0 qui doit être considérée comme nulle dans l'analyse statistique. Quel est le moyen le plus rapide de remplacer toute la valeur 0 par NULL dans R?
145
Réponses:
Remplacement de tous les zéros par NA:
Explication
1. Ce n'est pas
NULL
ce que vous devriez vouloir remplacer par des zéros. Comme il est dit dans?'NULL'
,ce qui est unique et, je suppose, peut être considéré comme l'objet le moins informatif et le plus vide. 1 Il n'est alors pas si surprenant que
Autrement dit, R ne réserve aucun espace pour cet objet nul. 2 Pendant ce temps, en regardant,
?'NA'
nous voyons queSurtout,
NA
est de longueur 1 pour que R lui réserve de l'espace. Par exemple,De plus, la structure de la trame de données exige que toutes les colonnes aient le même nombre d’éléments afin qu’il n’y ait pas de «trous» (c.
NULL
valeurs).Vous pouvez maintenant remplacer les zéros par
NULL
dans un bloc de données dans le sens de supprimer complètement toutes les lignes contenant au moins un zéro. Lors de l' utilisation, par exemplevar
,cov
oucor
, qui est en fait équivalent à la première substitution , avec des zérosNA
et le réglage de la valeur deuse
que"complete.obs"
. Cependant, cela n'est généralement pas satisfaisant car cela entraîne une perte d'informations supplémentaire.2. Au lieu d'exécuter une sorte de boucle, dans la solution, j'utilise la
df == 0
vectorisation.df == 0
renvoie (essayez-le) une matrice de même taille quedf
, avec les entréesTRUE
etFALSE
. De plus, nous sommes également autorisés à passer cette matrice au sous-ensemble[...]
(voir?'['
). Enfin, si le résultat dedf[df == 0]
est parfaitement intuitif, il peut sembler étrange que celadf[df == 0] <- NA
donne l'effet souhaité. L'opérateur d'affectation<-
n'est en effet pas toujours aussi intelligent et ne fonctionne pas de cette manière avec certains autres objets, mais il le fait avec des blocs de données; voir?'<-'
.1 L'ensemble vide dans la théorie des ensembles se sent en quelque sorte lié.
2 Autre similitude avec la théorie des ensembles: l'ensemble vide est un sous-ensemble de chaque ensemble, mais nous ne lui réservons aucun espace.
la source
Laissez-moi supposer que votre data.frame est un mélange de différents types de données et que toutes les colonnes n'ont pas besoin d'être modifiées.
pour modifier uniquement les colonnes 12 à 18 (du total 21), il suffit de faire ceci
la source
Une manière alternative sans le
[<-
fonction:Un exemple de cadre de données
dat
(copié sans vergogne à partir de la réponse de @ Chase):Les zéros peuvent être remplacés
NA
par lais.na<-
fonction:la source
dplyr::na_if()
est une option:la source
la source
Parce que quelqu'un a demandé la version Data.Table de ceci, et parce que la solution data.frame donnée ne fonctionne pas avec data.table, je propose la solution ci-dessous.
En gros, utilisez l'
:=
opérateur ->DT[x == 0, x := NA]
la source
for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA)
. Voir ici pour une discussion plus détaillée sur l'utilisation de data.table pour rechercher et remplacer des valeurs.Vous pouvez remplacer
0
parNA
uniquement dans les champs numériques (c'est-à-dire en excluant des éléments tels que les facteurs), mais cela fonctionne colonne par colonne:Avec une fonction, vous pouvez l'appliquer à l'ensemble de votre bloc de données:
Bien que vous puissiez remplacer le
1:5
par le nombre de colonnes de votre bloc de données ou par1:ncol(df)
.la source
1:5
par1:ncol(df)
à la fin. Je ne voulais pas rendre l'équation trop complexe ou difficile à lire.1:5
les numéros de colonne que vous voulez modifiés, comme12:15
, mais si vous vouliez confirmer qu'il n'affectera les colonnes numériques puis juste envelopper la deuxième ligne de la fonction dans une instruction if, comme ceci:if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
.Dans le cas où quelqu'un arrive ici via google à la recherche du contraire (c'est-à-dire comment remplacer tous les NA d'un data.frame par 0), la réponse est
OU
Utilisation de dplyr / tidyverse
la source