2012-11-28 30 views
25

Eventuali duplicati:
identifying or coding unique factors using RConversione variabili da fattori in R

sto avendo qualche problema con R.

Ho un insieme di dati simile al seguente, ma molto più a lungo.

A B Pulse 
1 2 23 
2 2 24 
2 2 12 
2 3 25 
1 1 65 
1 3 45 

Fondamentalmente, le prime 2 colonne sono codificate. A ha 1, 2 che rappresentano 2 pesi diversi. B ha 1, 2, 3 che rappresentano 3 diverse volte.

Poiché sono valori numerici codificati, R li tratterà come variabili numeriche. Ho bisogno di usare la funzione fattore per convertire queste variabili in fattori.

Aiuto?

+0

È possibile assegnare un segno di spunta se questo ha risposto alla domanda. –

risposta

38

Ecco un esempio:

#Create a data frame 
> d<- data.frame(a=1:3, b=2:4) 
> d 
    a b 
1 1 2 
2 2 3 
3 3 4 

#currently, there are no levels in the `a` column, since it's numeric as you point out. 
> levels(d$a) 
NULL 

#Convert that column to a factor 
> d$a <- factor(d$a) 
> d 
    a b 
1 1 2 
2 2 3 
3 3 4 

#Now it has levels. 
> levels(d$a) 
[1] "1" "2" "3" 

È inoltre possibile gestire questo durante la lettura nei dati. Vedi i parametri colClasses e stringsAsFactors in es. readCSV().

Nota che, dal punto di vista computazionale, il factoring di tali colonne non ti aiuterà molto e potrebbe rallentare il tuo programma (anche se trascurabilmente). L'utilizzo di un fattore richiederà che tutti i valori siano mappati agli ID dietro le quinte, quindi qualsiasi stampa di data.frame richiede una ricerca su questi livelli: un passaggio in più che richiede tempo.

I fattori sono ottimi quando si memorizzano stringhe che non si desidera memorizzare ripetutamente, ma preferiscono fare riferimento al loro ID. Prendi in considerazione la possibilità di memorizzare un nome più amichevole in tali colonne per beneficiare pienamente dei fattori.

+0

Ma ognuno dei numeri rappresenta qualcosa. Per A, 1 rappresenta lungo e 2 rappresenta corto. Per B, 1 2 3 rappresenta, 1kg, 2kg, 3kg Quindi ho bisogno di convertire tutti gli 1, i 2, ecc in 1kg, 2kg, long, short ecc. Ho bisogno di aggiungere etichette. – math11

+2

Prova a eseguire il codice sopra indicato, assegnando il valore 'levels' a qualcosa di più utile. Ad esempio, 'livelli (d $ a) <- c (" Long "," Short ")'. Ora tu (o un nuovo utente che guarda il tuo codice) non devi preoccuparti di memorizzare i mapping tra i tuoi ID e le tue etichette. R gestirà la mappatura per te e ti presenterà le etichette. –

19

dati di esempio

myData <- data.frame(A=rep(1:2, 3), B=rep(1:3, 2), Pulse=20:25) 



myData$A <-as.factor(myData$A) 
myData$B <-as.factor(myData$B) 

o si potrebbe selezionare le colonne del tutto e avvolgetelo bene:

# select columns 
cols <- c("A", "B") 
myData[,cols] <- data.frame(apply(myData[cols], 2, as.factor)) 

levels(myData$A) <- c("long", "short") 
levels(myData$B) <- c("1kg", "2kg", "3kg") 

esempio:

> myData 
     A B Pulse 
1 long 1kg 20 
2 short 2kg 21 
3 long 3kg 22 
4 short 1kg 23 
5 long 2kg 24 
6 short 3kg 25