2014-12-17 12 views
15

Ho un data.frame la cui colonna di classe è Factor. Mi piacerebbe convertirlo in numerico in modo che io possa usare la matrice di correlazione.Come convertire colonna data.frame da Fattore a numerico

> str(breast) 
'data.frame': 699 obs. of 10 variables: 
.... 
$ class     : Factor w/ 2 levels "2","4": 1 1 1 1 1 2 1 1 1 1 ... 
> table(breast$class) 
    2 4 
458 241 
> cor(breast) 
Error in cor(breast) : 'x' must be numeric 

Come è possibile convertire una colonna fattore in una colonna numerica?

+4

Questo problema si verifica troppo frequentemente per non essere un duplicato su SO –

+2

E la risposta migliore è sempre la stessa, "leggi' 'fattore'" –

risposta

56
breast$class <- as.numeric(as.character(breast$class)) 

Se si hanno molte colonne di convertirsi numeric

indx <- sapply(breast, is.factor) 
breast[indx] <- lapply(breast[indx], function(x) as.numeric(as.character(x))) 

Un'altra opzione è quella di utilizzare stringsAsFactors=FALSE durante la lettura del file utilizzando read.table o read.csv

Solo nel caso, altre opzioni per creare/cambia colonne

breast[,'class'] <- as.numeric(as.character(breast[,'class'])) 

o

breast <- transform(breast, class=as.numeric(as.character(breast))) 
9

Da ?factor:

Per trasformare un fattore f a circa i valori numerici originali, as.numeric(levels(f))[f] è raccomandato e leggermente più efficiente rispetto as.numeric(as.character(f)).

0

In alternativa al $dollarsign notazione, utilizzare un blocco within:

breast <- within(breast, { 
    class <- as.numeric(as.character(class)) 
}) 

nota che si desidera convertire il vostro vettore di un personaggio prima di convertirlo in un numerico. Semplicemente chiamando as.numeric(class) non gli ID corrispondenti a ciascun livello di fattore (1, 2) piuttosto che i livelli stessi.

4

Questo è FAQ 7.10. Altri hanno mostrato come applicarlo a una singola colonna in un frame di dati oa più colonne in un frame di dati. Ma questo è davvero il trattamento del sintomo, non curando la causa.

Un approccio migliore consiste nell'utilizzare l'argomento colClasses su read.table e le funzioni correlate per indicare a R che la colonna deve essere numerica in modo che non crei mai un fattore e crei valori numerici. Ciò inserirà NA per qualsiasi valore che non converta in numerico.

Un'altra opzione migliore è capire perché R non riconosce la colonna come numerica (di solito un carattere non numerico da qualche parte in quella colonna) e corregge i dati originali in modo che vengano letti correttamente senza dover creare NA s.

Best è una combinazione degli ultimi 2, assicurarsi che i dati siano corretti prima di leggerli e specificare colClasses in modo che R non debba indovinare (questo può accelerare la lettura).

Problemi correlati