Saltar al contenido

Estandarizar columnas de datos en R

Hemos investigado en distintos sitios para así brindarte la solución para tu duda, si continúas con inquietudes déjanos tu pregunta y responderemos con gusto, porque estamos para ayudarte.

Solución:

Debo suponer que quiso decir que quería una media de 0 y una desviación estándar de 1. Si sus datos están en un marco de datos y todas las columnas son numéricas, simplemente puede llamar a la scale Función en los datos para hacer lo que quieras.

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
scaled.dat <- scale(dat)

# check that we get mean of 0 and sd of 1
colMeans(scaled.dat)  # faster version of apply(scaled.dat, 2, mean)
apply(scaled.dat, 2, sd)

El uso de funciones integradas es elegante. Como este gato:

ingrese la descripción de la imagen aquí

Al darme cuenta de que la pregunta es antigua y se acepta una respuesta, proporcionaré otra respuesta como referencia.

scale está limitada por el hecho de que escala todas las variables. La solución a continuación permite escalar solo nombres de variables específicos mientras se conservan otras variables sin cambios (y los nombres de las variables podrían generarse dinámicamente):

library(dplyr)

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

dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
dat2

que me da esto:

> dat
          x        y        z
1  29.75859 3.633225 14.56091
2  30.05549 3.605387 12.65187
3  30.21689 3.318092 13.04672
4  29.53086 3.079992 15.07307
5  30.08582 3.437599 11.81096
6  30.10121 4.621197 17.59671
7  29.88505 4.051395 12.01248
8  29.89067 4.829316 12.58810
9  29.88711 4.662690 19.92150
10 29.82199 3.091541 18.07352

y

> dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
> dat2
          x          y           z
1  29.75859 -0.3004815 -0.06016029
2  30.05549 -0.3423437 -0.72529604
3  30.21689 -0.7743696 -0.58772361
4  29.53086 -1.1324181  0.11828039
5  30.08582 -0.5946582 -1.01827752
6  30.10121  1.1852038  0.99754666
7  29.88505  0.3283513 -0.94806607
8  29.89067  1.4981677 -0.74751378
9  29.88711  1.2475998  1.80753470
10 29.82199 -1.1150515  1.16367556

EDICIÓN 1 (2016): Abordó el comentario de Julian: la salida de scale es la matriz Nx1, por lo que idealmente deberíamos agregar una as.vector para convertir el tipo de matriz de nuevo en un tipo de vector. ¡Gracias Julián!

EDICIÓN 2 (2019): Citando el comentario de Duccio A.: Para la última versión de dplyr (versión 0.8), debe cambiar dplyr::funcs con list, como dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))

EDICIÓN 3 (2020): Gracias a @mj_whales: la solución anterior está en desuso y ahora debemos usar mutate_at.

Esto tiene 3 años. Aún así, siento que tengo que agregar lo siguiente:

La normalización más común es la transformación z, donde restas la media y divides por la desviación estándar de tu variable. El resultado tendrá media=0 y sd=1.

Para eso, no necesitas ningún paquete.

zVar <- (myVar - mean(myVar)) / sd(myVar)

Eso es todo.

Te mostramos las comentarios y valoraciones de los usuarios

Si guardas alguna vacilación y disposición de reaccionar nuestro sección eres capaz de ejecutar una crítica y con gusto lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *