266 votes

Normaliser les colonnes de données dans R

J'ai un ensemble de données appelé spam qui contient 58 colonnes et environ 3500 lignes de données relatives aux messages de spam.

Je prévois d'effectuer une régression linéaire sur cet ensemble de données à l'avenir, mais j'aimerais effectuer un prétraitement au préalable et normaliser les colonnes pour qu'elles aient une moyenne nulle et une variance unitaire.

On m'a dit que le meilleur moyen d'y parvenir est d'utiliser R, donc je voudrais demander comment puis-je réaliser la normalisation avec R ? J'ai déjà chargé les données correctement et je cherche simplement des paquets ou des méthodes pour effectuer cette tâche.

20voto

Samehmagd Points 443

Vous pouvez facilement normaliser les données en utilisant la fonction data.Normalization du package clusterSim. Elle fournit différentes méthodes de normalisation des données.

    data.Normalization (x,type="n0",normalization="column")

Arguments

x
vecteur, matrice ou ensemble de données type
type de normalisation : n0 - sans normalisation

n1 - normalisation ((x-moyenne)/sd)

n2 - normalisation positionnelle ((x-médiane)/mad)

n3 - unitisation ((x-moyenne)/plage)

n3a - unitisation positionnelle ((x-médiane)/plage)

n4 - unitisation avec minimum zéro ((x-min)/plage)

n5 - normalisation dans l'intervalle <-1,1> ((x-moyenne)/max(abs(x-moyenne)))

n5a - normalisation positionnelle dans l'intervalle <-1,1> ((x-médiane)/max(abs(x-médiane)))

n6 - transformation du quotient (x/sd)

n6a - transformation quotient positionnel (x/mad)

n7 - transformation du quotient (x/plage)

n8 - transformation du quotient (x/max)

n9 - transformation du quotient (x/moyenne)

n9a - transformation du quotient positionnel (x/médiane)

n10 - transformation du quotient (x/sum)

n11 - transformation du quotient (x/sqrt(SSQ))

n12 - normalisation ((x-mean)/sqrt(sum((x-mean)^2)))

n12a - normalisation positionnelle ((x-median)/sqrt(sum((x-median)^2)))

n13 - normalisation avec zéro étant le point central ((x-midrange)/(range/2))

normalisation
"column" - normalisation par variable, "row" - normalisation par objet

18voto

pat-s Points 1813

Avec dplyr v0.7.4 toutes les variables peuvent être mises à l'échelle en utilisant mutate_all() :

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

set.seed(1234)
dat <- tibble(x = rnorm(10, 30, .2), 
              y = runif(10, 3, 5),
              z = runif(10, 10, 20))

dat %>% mutate_all(scale)
#> # A tibble: 10 x 3
#>         x      y       z
#>     <dbl>  <dbl>   <dbl>
#>  1 -0.827 -0.300 -0.0602
#>  2  0.663 -0.342 -0.725 
#>  3  1.47  -0.774 -0.588 
#>  4 -1.97  -1.13   0.118 
#>  5  0.816 -0.595 -1.02  
#>  6  0.893  1.19   0.998 
#>  7 -0.192  0.328 -0.948 
#>  8 -0.164  1.50  -0.748 
#>  9 -0.182  1.25   1.81  
#> 10 -0.509 -1.12   1.16

Des variables spécifiques peuvent être exclues en utilisant mutate_at() :

dat %>% mutate_at(scale, .vars = vars(-x))
#> # A tibble: 10 x 3
#>        x      y       z
#>    <dbl>  <dbl>   <dbl>
#>  1  29.8 -0.300 -0.0602
#>  2  30.1 -0.342 -0.725 
#>  3  30.2 -0.774 -0.588 
#>  4  29.5 -1.13   0.118 
#>  5  30.1 -0.595 -1.02  
#>  6  30.1  1.19   0.998 
#>  7  29.9  0.328 -0.948 
#>  8  29.9  1.50  -0.748 
#>  9  29.9  1.25   1.81  
#> 10  29.8 -1.12   1.16

Créé le 2018-04-24 par le paquet reprex (v0.2.0).

11voto

BBKim Points 141

Encore une fois, même s'il s'agit d'une vieille question, elle est très pertinente ! Et j'ai trouvé un moyen simple de normaliser certaines colonnes sans avoir recours à aucun paquet :

normFunc <- function(x){(x-mean(x, na.rm = T))/sd(x, na.rm = T)}

Par exemple

x<-rnorm(10,14,2)
y<-rnorm(10,7,3)
z<-rnorm(10,18,5)
df<-data.frame(x,y,z)

df[2:3] <- apply(df[2:3], 2, normFunc)

Vous verrez que les colonnes y et z ont été normalisées. Aucun paquet n'est nécessaire :-)

9voto

Amit Points 50

L'échelle peut être utilisée à la fois pour le cadre de données complet et pour des colonnes spécifiques. Pour des colonnes spécifiques, le code suivant peut être utilisé :

trainingSet[, 3:7] = scale(trainingSet[, 3:7]) # For column 3 to 7
trainingSet[, 8] = scale(trainingSet[, 8]) # For column 8 

Trame de données complète

trainingSet <- scale(trainingSet)

4voto

Sebastian Points 459

El effondrement fournit la fonction d'échelle la plus rapide - mise en œuvre en C++ à l'aide de l'algorithme Welfords Online :

dat <- data.frame(x = rnorm(1e6, 30, .2), 
                  y = runif(1e6, 3, 5),
                  z = runif(1e6, 10, 20))

library(collapse)
library(microbenchmark)
microbenchmark(fscale(dat), scale(dat))

Unit: milliseconds
        expr       min       lq      mean    median        uq      max neval cld
 fscale(dat)  27.86456  29.5864  38.96896  30.80421  43.79045 313.5729   100  a 
  scale(dat) 357.07130 391.0914 489.93546 416.33626 625.38561 793.2243   100   b

En outre : fscale est S3 générique pour les vecteurs, les matrices et les cadres de données et supporte également les opérations de mise à l'échelle groupée et/ou pondérée, ainsi que la mise à l'échelle vers des moyennes et des écarts types arbitraires.

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