2013-10-19 23 views
6

sto cercando di ottenere tutte le colonne del mio data frame per essere nella stessa scala ..Come posso ridimensionare ogni colonna del mio data frame su una scala 0-100? (in r)

in questo momento ho qualcosa di simile ... dove a è su una scala 0-1 b è su una scala di 100 e C è su una scala 1-5

a b  c 
0 89 4 
1 93 3 
0 88 5 

come potrei farlo un 100scale come questo ...

a  b  c 
0  89  80 
100 93  60 
0  88  100 

Mi auguro che sia un po 'chiaro .. ho provato la scala() ma non riesco a farlo funzionare.

+0

correlati: http://stackoverflow.com/questions/15468866/scaling-a-numeric-matrix-in-r-with-values -0-to-1 –

+0

La colonna 'b' non sembra essere ridimensionata nell'esempio ... ma presumo che anche una dovrebbe essere. – beroe

+0

la mia colonna b è già su una scala di 100 punti, non voglio che cambi. –

risposta

14

Utilizzando scale, se dat è il nome del data frame:

## for one column 
dat$a <- scale(dat$a, center = FALSE, scale = max(dat$a, na.rm = TRUE)/100) 
## for every column of your data frame 
dat <- data.frame(lapply(dat, function(x) scale(x, center = FALSE, scale = max(x, na.rm = TRUE)/100))) 

Per un caso semplice come questo, si potrebbe anche scrivere la propria funzione.

fn <- function(x) x * 100/max(x, na.rm = TRUE) 
fn(c(0,1,0)) 
# [1] 0 100 0 
## to one column 
dat$a <- fn(dat$a) 
## to all columns of your data frame 
dat <- data.frame(lapply(dat, fn)) 
+0

Sembra funzionare ma restituisce NA per tutte le colonne della mia scala 0-1 –

+0

Forse aggiungere 'na.rm = TRUE' a' max' potrebbe essere d'aiuto. Anche se non posso dirlo con certezza senza guardare i tuoi dati. –

+0

che ha fatto il trucco! Grazie! –

0

La mia esperienza è che questo è ancora senza risposta, che cosa succede se una delle colonne aveva un -2, la risposta attuale non produrrebbe una scala 0-100. Mentre apprezzo la risposta, quando ho tentato di farlo, ho variabili che vanno da -100 a 100 e questo ha lasciato ancora qualcosa di negativo?

ho una soluzione nel caso in cui questo si applica a voi:

rescale <- function(x) (x-min(x))/(max(x) - min(x)) * 100 
dat <- rescale(dat)