9 votos

Cómo grupo / centro de estandarizar las variables en R?

Las funciones que estoy familiarizado con incluir la escala de la base R, cambiar la escala de BRAZO.

Tal vez la mejor manera sería utilizar alguna variante de aplicar, especificando una o más variables a utilizar como las variables de agrupación.

7voto

DavLink Puntos 101

Aquí hay una posible plyr solución. Tenga en cuenta que se basa en la base transform() función.

my.df <- data.frame(x=rnorm(100, mean=10), 
                    sex=sample(c("M","F"), 100, rep=T), 
                    group=gl(5, 20, labels=LETTERS[1:5]))
library(plyr)
ddply(my.df, c("sex", "group"), transform, x.std = scale(x))

(Podemos comprobar si funciona como se espera, por ejemplo, with(subset(my.df, sex=="F" & group=="A"), scale(x)))

Básicamente, el 2º argumento describe cómo "split" de los datos, el 3er argumento cuál es la función de aplicar a cada fragmento. El de arriba va a añadir una variable x.std a los datos.marco. Uso x si desea reemplazar el original de la variable de la escala.

7voto

Hans Passant Puntos 475940
group.center <- function(var,grp) {
    return(var-tapply(var,grp,mean,na.rm=T)[grp])
}

3voto

georg Puntos 1742

Aquí está una de datos.tabla de solución. Es definitivamente más rápido que plyr (relevante sólo para grandes conjuntos de datos). Tal vez más adelante voy a hacer un dplyr ejemplo.

# generate example data
raw.data <- data.frame( outcome = c(rnorm(500, 100, 15), rnorm(500, 110, 12)), 
                        group = c(rep("a", 500), rep("b", 500)))

library(data.table)
# convert dataframe to data.table
raw.data <- data.table(raw.data, key = "group")

# create group standardized outcome variable
raw.data[ , group_std_outcome := (outcome - mean(outcome, na.rm = TRUE)) /  
           sd(outcome, na.rm = TRUE), "group"]

(Sí, he redescubierto una pregunta que le hice hace años, cuando yo era un R noob ;)

2voto

pkaeding Puntos 12935

Usted puede utilizar (entre otros) tapply (la plyr paquete contiene una gran cantidad de otras opciones que pueden ser más adecuados para su situación específica):

tapply(variabletoscale, list(groupvar1, groupvar2), scale)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X