2009-08-07 17 views
9

Estoy tratando de normalizar algunos datos que tengo en un marco de datos. Quiero aprovechar cada valor y ejecutarlo a través de la función Pnorm junto con la media y la desviación estándar de la columna de valor reside en Uso de bucles, así es como me gustaría escribir lo que quiero hacer:.Aplicar pnorm a columnas de un marco de datos

#example data 
hist_data <- data.frame(matrix(rnorm(200,mean=5,sd=.5),nrow=20)) 

n <- dim(hist_data)[2] #columns=10 
k <- dim(hist_data)[1] #rows =20 

#set up the data frame which we will populate with a loop 
normalized <- data.frame(matrix(nrow = nrow(hist_data), ncol = ncol(hist_data))) 

#hot loop in loop action 
for (i in 1:n){ 
    for (j in 1:k){ 
     normalized[j,i] <- pnorm(hist_data[j,i], 
           mean = mean(hist_data[,i]), 
           sd = sd(hist_data[,i])) 
    } 
} 
normalized 

Parece que en R debería haber una forma útil de hacer esto. Yo pensé que era inteligente por lo que trató de usar la función de aplicación:

#trouble ahead 
hist_data <- data.frame(matrix(rnorm(200, mean = 5,sd = .5), nrow=10)) 
normalized <- apply(hist_data, 2, pnorm, mean = mean(hist_data), sd = sd(hist_data)) 
normalized 

Muy a mi pesar, que no produce lo que esperaba. Los elementos superior izquierdo e inferior derecho de la salida son correctos, pero eso es todo. Entonces, ¿cómo puedo de-loopify mi vida?

Puntos de bonificación si me puede decir qué está haciendo mi segundo bloque de código. Me sigue pareciendo un misterio. :)

+0

En el código de ejemplo, las filas y columnas de las palabras se invierten en los comentarios. Además, define las variables n y k para mantener columnas y filas, y luego no las usa en el comando de la matriz. Puede que quieras limpiar eso para que los demás no se confundan. –

+0

buen punto en la redacción que está al revés. Pero en cuanto a nyk, se usan en "for (i en 1: n)" y "for (j en 1: k)" –

+0

Right. Perdió esa segunda parte. ¡Buen post! –

Respuesta

6

que desee:

normalize <- apply(hist_data, 2, function(x) pnorm(x, mean=mean(x), sd=sd(x))) 

El problema es que estás pasando en la columna individual en pnorm, pero la totalidad de hist_data en tanto la media & la sd.

Como ya he mencionado en twitter, estoy hay estadísticas chico así que no puedo contestar nada de lo que en realidad estás tratando de hacer :)

Cuestiones relacionadas