2012-02-12 5 views
94

Sto programmando in linguaggio R. Vorrei cambiare il formato (classe) di alcune colonne del mio oggetto data.frame (mydf) dal fattore al fattore a . Non voglio farlo quando sto leggendo il file di testo tramite la funzione read.table(). Qualsiasi aiuto sarebbe apprezzato.convertire il formato della colonna data.frame dal carattere al fattore

+6

mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn) –

+0

Grazie! ma ho un altro problema Ho il nome di ogni colonna in una matrice di caratteri col_names []. Come posso usare il comando precedente (mydf $ col_names [i]) non funziona. – Rasoul

+0

Un modo per farlo automaticamente per tutte le variabili di caratteri, dato che data.frame lo fa con stringheAsFactors? –

risposta

133

Ciao benvenuti nel mondo di R.

mtcars #look at this built in data set 
str(mtcars) #allows you to see the classes of the variables (all numeric) 

#one approach it to index with the $ sign and the as.factor function 
mtcars$am <- as.factor(mtcars$am) 
#another approach 
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl']) 
str(mtcars) # now look at the classes 

Questo funziona anche per il personaggio, date, numeri interi e le altre classi

Dal momento che siete nuovi a R Io suggerirei di avere un guardare a questi due siti web: manuali di riferimento

R: http://cran.r-project.org/manuals.html

R carta di Riferimento:http://cran.r-project.org/doc/contrib/Short-refcard.pdf

+0

Grazie! ma ho un altro problema Ho il nome di ogni colonna in una matrice di caratteri col_names []. Come posso usare il comando precedente (né 'mydf $ col_names [i]' né 'mydf [, col_names [i]]' non funziona.) – Rasoul

+0

@Rasoul, 'mydf [, nomi_col]' lo farà – DrDom

+1

+ 1 per i ref. Questa è roba di base, che è OK da chiedere, ma è anche bene essere consapevoli del vasto lavoro che è stato messo in questi (e simili) lavori. –

67
# To do it for all names 
df[] <- lapply(df, factor) # the "[]" keeps the dataframe structure 
col_names <- names(df) 
# do do it for some names in a vector named 'col_names' 
df[col_names] <- lapply(df[col_names] , factor) 

Spiegazione. Tutti i dataframe sono elenchi ed i risultati di [ utilizzati con argomenti con valori multipli sono anch'essi elenchi, quindi il loop su liste è il compito di lapply. L'assegnazione precedente creerà un insieme di elenchi che la funzione data.frame.[<- dovrebbe attaccare con successo nuovamente dentro nella dataframe, df

Un'altra strategia potrebbe essere quella di convertire solo le colonne in cui il numero di elementi univoci è inferiore a qualche criterio, diciamo meno il registro del numero di righe come un esempio:

cols.to.factor <- sapply(df, function(col) length(unique(col)) < log10(length(col))) 
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor) 
+0

Ciascuno di questi dovrebbe funzionare. Ho appena falsificato la tua affermazione che "deve essere" come dici tu provando con i nomi di <- c ('vs', 'am', 'gear'); mtcars [, names] <- lapply (mtcars [, names], factor) '.. Forse dovresti essere più attento alle critiche dei tuoi anziani. –

+0

Questa è una soluzione molto bella! Può anche funzionare con numeri di colonna che potrebbero essere particolarmente utili se si desidera modificare molti ma non tutti. Ad esempio, col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57), quindi df [, col_nums] <- lapply (df [, col_nums] , fattore). – WGray

+0

Avvertenza: la prima soluzione non funziona se 'length (col_names) == 1'. In questo caso, 'df [, nomi_col]' viene automaticamente abbassato di un vettore invece di un elenco di lunghezza 1, e quindi 'lapply' tenta di operare su ogni voce piuttosto che sulla colonna nel suo complesso. Questo può essere prevenuto usando 'df [, col_names, drop = FALSE]'. –

9

Se si desidera cambiare tutti variabili carattere nel data.frame a fattori dopo aver già caricato i dati, si può fare in questo modo, a un data.frame chiamato dat:

character_vars <- lapply(dat, class) == "character" 
dat[, character_vars] <- lapply(dat[, character_vars], as.factor) 

Questo crea un vettore identificare quali colonne sono di classe character, quindi applica as.factor a tali colonne.

dati del campione:

dat <- data.frame(var1 = c("a", "b"), 
        var2 = c("hi", "low"), 
        var3 = c(0, 0.1), 
        stringsAsFactors = FALSE 
       ) 
+0

La conversione completa di ogni variabile di carattere in fattore di solito avviene durante la lettura dei dati, ad es. Con 'stringsAsFactors = TRUE', ma questo è utile quando diciamo che hai letto i dati con' read_excel() 'da' readxl' pacchetto e desidera addestrare un modello di foresta casuale che non accetta variabili di carattere. –

5

Un altro modo breve si potrebbe usare un tubo (%<>%) dal pacchetto magrittr. Converte la colonna di caratteri mycolumn in un fattore.

library(magrittr) 

mydf$mycolumn %<>% factor 
+0

Si prega di modificare con ulteriori informazioni. Le risposte solo per codice e "prova questo" sono scoraggiate, perché non contengono contenuti ricercabili e non spiegano perché qualcuno dovrebbe "provare questo". Facciamo uno sforzo qui per essere una risorsa per la conoscenza. –

+0

pls se voglio usarlo per tutte le colonne del mio df? –

1

L'ho fatto con una funzione. In questo caso mi trasformare solo variabili carattere di fattore:

for (i in 1:ncol(data)){ 
    if(is.character(data[,i])){ 
     data[,i]=factor(data[,i]) 
    } 
}