2009-08-07 6 views
9

Sto provando a normalizzare alcuni dati che ho in un frame di dati. Voglio prendere ogni valore ed eseguirlo tramite la funzione pnorm con media e deviazione standard della colonna del valore vive in Uso cicli, ecco come avrei scritto che cosa voglio fare:.Applicazione di pnorm alle colonne di un frame di dati

#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 

Sembra che in R ci dovrebbe essere un comodo modo dandy per farlo. Pensavo di essere intelligente così provato ad utilizzare la funzione di applicare:

#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 

Con mio dispiacere, che non produce quello che mi aspettavo. Gli elementi in alto a sinistra e in basso a destra dell'output sono corretti, ma il gioco è fatto. Quindi, come posso de-loopify la mia vita?

Punti bonus se puoi dirmi cosa sta facendo il mio secondo blocco di codice. Tipo di mistero per me ancora. :)

+0

Nel codice esempio, le parole righe e le colonne sono invertiti in i commenti Inoltre, si definiscono le variabili n e k per contenere colonne e righe, quindi non riescono a utilizzarle nel comando matrice. Potrebbe desiderare di ripulirlo in modo che gli altri non siano confusi. –

+0

buon punto sul testo essendo indietro. Ma per quanto riguarda n e k, sono usati in "per (i in 1: n)" e "per (j in 1: k)" –

+0

A destra. Mancava quella seconda parte. Buon post! –

risposta

6

desiderato:

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

Il problema è che si sta passando nella colonna individuo in pnorm, ma l'intera hist_data sia nel media & la sd.

Come ho già detto su Twitter, sono Nessuna statistica ragazzo così non posso rispondere a nulla di ciò che si sta effettivamente cercando di fare :)