2016-09-05 13 views
1

Supposons que j'ai les données suivantes:données Normaliser dans la colonne R data.frame

a <- data.frame(var1=letters,var2=runif(26)) 

Supposons que je veux à l'échelle chaque valeur var2 telle que la somme de la colonne var2 est égale à 1 (tourner essentiellement la colonne var2 dans une distribution de probabilité)

J'ai essayé ce qui suit:

a$var2 <- lapply(a$var2,function(x) (x-min(a$var2))/(max(a$var2)-min(a$var2))) 

cela donne non seulement une somme globale plus e un 1 mais aussi transforme la colonne var2 en une liste sur laquelle je ne peux pas faire des opérations comme sum

Existe-t-il un moyen valide de transformer cette colonne en une distribution de probabilité?

Répondre

3

Supposons que vous ayez un vecteur x avec des valeurs non-négatives et pas NA, vous pouvez normaliser par

x/sum(x) 

qui est une fonction de masse de probabilité appropriée.

La transformation de vous prendre:

(x - min(x))/(max(x) - min(x)) 

ne redimensionne x sur [0, 1], mais ne garantit pas "sommation à 1".


En ce qui concerne votre code

Il n'y a pas besoin d'utiliser lapply ici:

lapply(a$var2, function(x) (x-min(a$var2))/(max(a$var2) - min(a$var2))) 

utiliser simplement l'opération vectorisé

a$var2 <- with(a, (var2 - min(var2))/(max(var2) - min(var2))) 

Comme vous l'avez dit, lapply vous donne une liste, un sd c'est ce que "l" dans "lapply" se réfère à. Vous pouvez utiliser unlist pour réduire cette liste en un vecteur; ou, vous pouvez utiliser sapply, où "s" implique "simplification (si possible)".

+0

je vous remercie de votre contribution détaillée, j'accepterai votre réponse dès que possible – Imlerith