2009-08-07 5 views
9

J'essaie de normaliser certaines données que j'ai dans une trame de données. Je veux prendre chaque valeur et l'exécuter par la fonction pnorm ainsi que la moyenne et l'écart type de la colonne la valeur vit en boucle utilisant, voici comment j'écrire ce que je veux faire.Application de pnorm aux colonnes d'une trame de données

#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 

Il semble que dans R il devrait y avoir un moyen pratique de faire cela. Je croyais intelligent donc essayé d'utiliser la fonction appliquer:

#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 

Beaucoup à mon grand regret, cela ne produit pas ce que je pensais. Les éléments en haut à gauche et en bas à droite de la sortie sont corrects, mais c'est tout. Alors, comment puis-je dé-boucler ma vie?

Points bonus si vous pouvez me dire ce que fait réellement mon second bloc de code. Un peu un mystère pour moi encore. :)

+0

Dans votre code exemple, les lignes de mots et les colonnes sont inversées dans les commentaires. En outre, vous définissez les variables n et k pour contenir les colonnes et les lignes, puis ne les utilisez pas dans la commande matrix. Peut vouloir nettoyer cela pour que les autres ne soient pas confus. –

+0

bon point sur le libellé étant en arrière. Mais comme pour n et k, ils sont utilisés dans "for (i in 1: n)" et "for (j in 1: k)" –

+0

Droite. Manqué cette deuxième partie. Bon post! –

Répondre

6

Vous voulez:

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

Le problème est que vous passez dans la colonne individuelle dans pnorm, mais l'ensemble hist_data à la fois la moyenne & SD.

Comme je l'ai mentionné sur Twitter, je ne suis pas stats gars donc je ne peux pas répondre à quoi que ce soit au sujet de ce que vous essayez réellement de le faire :)

Questions connexes