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?

0voto

stragu Points 626

Pour plus de complétude, basé sur la réponse de @sbha, voici la version tidyverse avec la fonction across() disponible dans dplyr depuis la version 1.0 (qui remplace les variantes *_at(), et d'autres):

# données aléatoires
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))
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)
# avec le pipe de magrittr
x %>% mutate(across(1:2, ~ replace_na(.x, 0)))
#>    a b  c
#> 1  2 2  5
#> 2  2 2  2
#> 3  1 0  5
#> 4  0 2  2
#> 5  1 2 NA
#> 6  1 2  3
#> 7  2 2  4
#> 8  2 1  4
#> 9  0 0  3
#> 10 2 0  1
# avec le pipe natif (depuis R 4.1)
x |> mutate(across(1:2, ~ replace_na(.x, 0)))
#>    a b  c
#> 1  2 2  5
#> 2  2 2  2
#> 3  1 0  5
#> 4  0 2  2
#> 5  1 2 NA
#> 6  1 2  3
#> 7  2 2  4
#> 8  2 1  4
#> 9  0 0  3
#> 10 2 0  1

Créé le 2021-12-08 par le paquet reprex (v2.0.1)

-4voto

Juanico Lasa Points 1

Cela fonctionne bien pour moi

DataTable DT = new DataTable();

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

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