Comment remplacer les valeurs NA dans un tableau * pour les colonnes sélectionnées *? data.frame, data.table

Il y a beaucoup de messages sur le remplacement des valeurs NA. Je suis conscient que l’on pourrait remplacer les AN dans le tableau / cadre suivant par ce qui suit:

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

Mais, si je veux le limiter à certaines colonnes seulement? Laissez-moi vous montrer un exemple.

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)) 

Qui donne:

  abc 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 

Ok, alors je veux seulement limiter le remplacement aux colonnes “a” et “b”. Ma tentative était la suivante:

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

et:

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

Ce qui ne marche pas

Ma tentative de data.table, où y<-data.table(x) , ne fonctionnerait évidemment jamais:

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

Je veux passer des colonnes dans l’argument is.na, mais cela ne fonctionnerait évidemment pas.

Je voudrais le faire dans un data.frame et un data.table. Mon but ultime est de recoder les valeurs 1: 2 à 0: 1 dans ‘a’ et ‘b’ tout en gardant ‘c’, car ce n’est pas une variable logique. J’ai un tas de colonnes donc je ne veux pas le faire une par une. Et je voudrais juste savoir comment faire cela.

Avez-vous des suggestions?

Tu peux faire:

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

ou mieux (IMHO), utilisez les noms de variable:

 x[c("a", "b")][is.na(x[c("a", "b")])] <- 0 

Dans les deux cas, 1:2 ou c("a", "b") peuvent être remplacés par un vecteur prédéfini.

Cela fonctionnera pour votre version de data.table :

 for (col in c("a", "b")) y[is.na(get(col)), (col) := 0] 

Comme David Arenburg l’indique ci-dessous, vous pouvez également utiliser set (side data.frame – vous pouvez l’utiliser soit sur data.frame soit sur data.table ):

 for (col in 1:2) set(x, which(is.na(x[[col]])), col, 0) 

Ceci est maintenant sortingvial dans tidyr avec replace_na (). La fonction semble fonctionner pour data.tables ainsi que data.frames:

 tidyr::replace_na(x, list(a=0, b=0)) 

Vous ne savez pas si cela est plus concis, mais cette fonction trouvera et autorisera également le remplacement des NA (ou de toute valeur que vous aimez) dans les colonnes sélectionnées d’une data.table:

 update.mat <- function(dt, cols, criteria) { require(data.table) x <- as.data.frame(which(criteria==TRUE, arr.ind = TRUE)) y <- as.matrix(subset(x, x$col %in% which((names(dt) %in% cols), arr.ind = TRUE))) y } 

Pour l'appliquer:

 y[update.mat(y, c("a", "b"), is.na(y))] <- 0 

La fonction crée une masortingce des colonnes et des lignes sélectionnées (coordonnées de cellule) qui répondent aux critères d'entrée (dans ce cas, is.na == TRUE).

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 

cela fonctionne bien pour moi

 DataTable DT = new DataTable(); DT = DT.AsEnumerable().Select(R => { R["Campo1"] = valor; return (R); }).ToArray().CopyToDataTable();