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.

2voto

Jack Points 189

El dplyr possède deux fonctions qui permettent de réaliser cette tâche.

> require(dplyr)

Pour muter spécifique colonnes d'un tableau de données, vous pouvez utiliser la fonction mutate_at() . Pour muter tous vous pouvez utiliser mutate_all .

Voici un bref exemple d'utilisation de ces fonctions pour normaliser les données.

Mutation de colonnes spécifiques :

dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_at(vars("a", "c"), scale)) # can also index columns by number, e.g., vars(c(1,3))

> apply(dt, 2, mean)
            a             b             c 
 1.783137e-16  5.064855e-01 -5.245395e-17 

> apply(dt, 2, sd)
        a         b         c 
1.0000000 0.2906622 1.0000000 

Mutation de toutes les colonnes :

dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_all(scale))

> apply(dt, 2, mean)
            a             b             c 
-1.728266e-16  9.291994e-17  1.683551e-16 

> apply(dt, 2, sd)
a b c 
1 1 1

1voto

Claud H Points 575

Avant de trouver ce fil de discussion, j'avais le même problème. J'avais des types de colonnes dépendant de l'utilisateur, j'ai donc écrit un fichier de type for boucle passant par eux et obtenant les colonnes nécessaires scale 'd. Il existe probablement de meilleures façons de procéder, mais cette méthode a permis de résoudre le problème :

 for(i in 1:length(colnames(df))) {
        if(class(df[,i]) == "numeric" || class(df[,i]) == "integer") {
            df[,i] <- as.vector(scale(df[,i])) }
        }

as.vector est une partie nécessaire, parce qu'il s'est avéré scale fait rownames x 1 matrice, ce qui n'est généralement pas ce que vous voulez avoir dans votre data.frame .

1voto

Ian Points 53

@BBKim a donné la meilleure réponse, mais ça peut être fait plus court. Je suis surpris que personne ne l'ait encore inventé.

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))

0voto

Yash Jaiswal Points 23

Utilisez le paquet "recommenderlab". Téléchargez et installez le paquet. Ce paquet a une commande "Normalize" intégrée. Elle vous permet également de choisir l'une des nombreuses méthodes de normalisation, à savoir 'center' ou 'Z-score'. Suivez l'exemple suivant :

## create a matrix with ratings
m <- matrix(sample(c(NA,0:5),50, replace=TRUE, prob=c(.5,rep(.5/6,6))),nrow=5, ncol=10, dimnames = list(users=paste('u', 1:5, sep=&rdquo;), items=paste('i', 1:10, sep=&rdquo;)))

## do normalization
r <- as(m, "realRatingMatrix")
#here, 'centre' is the default method
r_n1 <- normalize(r) 
#here "Z-score" is the used method used
r_n2 <- normalize(r, method="Z-score")

r
r_n1
r_n2

## show normalized data
image(r, main="Raw Data")
image(r_n1, main="Centered")
image(r_n2, main="Z-Score Normalization")

0voto

DC1 Points 11

Le code ci-dessous pourrait être le moyen le plus court d'y parvenir.

dataframe <- apply(dataframe, 2, scale)

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