107 votes

Comment remplacer les valeurs NA dans un tableau pour les colonnes sélectionnées

Il y a beaucoup de messages sur le remplacement des valeurs NA. Je sais qu'on peut remplacer les NA dans le tableau/cadre suivant par ce qui suit :

x[is.na(x)] < -0

Mais, que faire si je veux le restreindre à certaines colonnes uniquement? Permettez-moi de vous montrer un exemple.

Tout d'abord, commençons par un jeu de données.

set.seed(1234)
x <- data.frame(a=sample(c(1,2,NA), 10, replace=T),
                b=sample(c(1,2,NA), 10, replace=T), 
                c=sample(c(1:5,NA), 10, replace=T))

Ce qui donne :

    a  b  c
1   1 NA  2
2   2  2  2
3   2  1  1
4   2 NA  1
5  NA  1  2
6   2 NA  5
7   1  1  4
8   1  1 NA
9   2  1  5
10  2  1  1

D'accord, je veux simplement restreindre le remplacement aux colonnes 'a' et 'b'. Ma tentative a été la suivante :

x[is.na(x), 1:2] < -0

et :

x[is.na(x[1:2])] < -0

Ce qui ne fonctionne pas.

Ma tentative avec data.table, où y ← data.table(x), n'allait évidemment jamais fonctionner :

y[is.na(y[,list(a,b)]), ]

Je veux passer les colonnes à l'intérieur de l'argument is.na mais évidemment ça ne fonctionnerait pas.

Je voudrais faire cela dans un data.frame et une data.table. Mon objectif final est de recoder de 1 à 2 en 0 à 1 dans 'a' et 'b' tout en laissant 'c' tel qu'il est, car ce n'est pas une variable logique. J'ai plein de colonnes donc je ne veux pas le faire une par une. Et, je voudrais juste savoir comment faire cela.

Avez-vous des suggestions?

1voto

young Chen Points 1

Nous pouvons le résoudre de la manière data.table avec la fonction tidyr::repalce_na et lapply

library(data.table)
library(tidyr)
setDT(df)
df[,c("a","b","c"):=lapply(.SD,function(x) replace_na(x,0)),.SDcols=c("a","b","c")]

De cette façon, nous pouvons également résoudre le collage des colonnes avec la chaîne NA. D'abord, nous replace_na(x,""), puis nous pouvons utiliser stringr::str_c pour combiner les colonnes!

1voto

Yoann Pageaud Points 163

À partir de la table de données y, vous pouvez simplement écrire :
y[, (cols):=lapply(.SD, function(i){i[is.na(i)] <- 0; i}), .SDcols = cols]
N'oubliez pas d'importer library(data.table) avant de créer y et d'exécuter cette commande.

1voto

Richard Allen Points 93

Cela nécessitait un peu plus pour traiter les NA dans les facteurs.

J'ai trouvé une fonction utile ici, que vous pouvez ensuite utiliser avec mutate_at ou mutate_if:

replace_factor_na <- function(x){
    x <- as.character(x)
    x <- if_else(is.na(x), 'AUCUN', x)
    x <- as.factor(x)
}

df <- df %>%
    mutate_at(
        vars(noms_des_colonnes_de_vecteur), 
        replace_factor_na
    )

Ou appliquer à toutes les colonnes de facteurs:

df <- df %>%
  mutate_if(is.factor, replace_factor_na)

0voto

Rafa Points 329

Pour une colonne spécifique, il existe une alternative avec sapply

DF <- data.frame(A = letters[1:5],
             B = letters[6:10],
             C = c(2, 5, NA, 8, NA))

DF_NEW <- sapply(seq(1, nrow(DF)),
                    function(i) ifelse(is.na(DF[i,3]) ==
                                       TRUE,
                                       0,
                                       DF[i,3]))

DF[,3] <- DF_NEW
DF

0voto

Grec001 Points 160

C'est assez pratique avec data.table et stringr

librairie(data.table)
librairie(stringr)

x[, lapply(.SD, function(xx) {str_replace_na(xx, 0)})]

Pour votre information

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X