Converti il ​​formato della colonna data.frame da carattere a fattore


153

Vorrei cambiare il formato (classe) di alcune colonne del mio oggetto data.frame ( mydf) da charactor al fattore .

Non voglio farlo quando sto leggendo il file di testo per read.table()funzione.

Qualsiasi aiuto sarebbe apprezzato.


12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe

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

Un modo per farlo automaticamente per tutte le variabili di carattere, come data.frame fa con stringheAsFactors?
Etienne Low-Décarie,

@ EtienneLow-Décarie: solo unclasse utilizzare data.framesul risultato.
IRTFM,

Risposte:


197

Ciao benvenuto 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 con caratteri, date, numeri interi e altre classi

Dato che sei nuovo su R, ti suggerisco di dare un'occhiata a questi due siti Web:

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

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


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

1
@Rasoul, mydf[, col_names]lo farà
DrDom,

3
+1 per i riferimenti. Questa è roba di base, che è OK chiedere, ma va anche bene essere consapevoli del vasto lavoro che è stato messo in queste (e simili) opere.
Roman Luštrik,

84
# 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 frame di dati sono elenchi e i risultati dell'uso [con più argomenti valutati sono allo stesso modo elenchi, quindi il compito di eseguire il loop su elenchi lapply. L'assegnazione di cui sopra creerà una serie di elenchi in cui la funzione data.frame.[<-dovrebbe reinserirsi correttamente nel frame di dati,df

Un'altra strategia sarebbe quella di convertire solo quelle colonne in cui il numero di elementi univoci è inferiore ad alcuni criteri, ad esempio meno del registro del numero di righe come esempio:

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

Questa è un'ottima soluzione! Può anche funzionare con i 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

Avvertenza: la prima soluzione non funziona se length(col_names)==1. In tal caso, df[,col_names]viene automaticamente ridotto a un vettore anziché a un elenco di lunghezza 1, quindi lapplytenta di operare su ciascuna voce anziché sulla colonna nel suo insieme. Questo può essere prevenuto usando df[,col_names,drop=FALSE].
P Schnell,

Questo è un buon punto. L'altra chiamata che manterrebbe lo stato dell'elenco è da usare df[col_names].
IRTFM,

27

È possibile utilizzare dplyr::mutate_if()per convertire tutte le colonne di caratteri o dplyr::mutate_at()per selezionare le colonne di caratteri con nome in fattori:

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)

18

Se vuoi cambiare tutte le variabili di carattere nel tuo data.frame in fattori dopo aver già caricato i tuoi dati, puoi farlo in questo modo, in un data.frame chiamato dat:

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

Questo crea un vettore che identifica quali colonne sono di classe character, quindi si applica as.factora quelle colonne.

Dati di esempio:

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

La conversione completa di ogni variabile di carattere in fattore si verifica in genere durante la lettura dei dati, ad esempio con stringsAsFactors = TRUE, ma ciò è utile quando si dice, hai letto i dati con read_excel()dal readxlpacchetto e vuoi addestrare un modello di foresta casuale che non accetta variabili di carattere.
Sam Firke,

13

Un altro modo breve che potresti usare è una pipe ( %<>%) dal pacchetto magrittr . Converte la colonna di caratteri mycolumn in un fattore.

library(magrittr)

mydf$mycolumn %<>% factor

Modifica con ulteriori informazioni. Le risposte di solo 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.
Brian Tompsett - 莱恩 莱恩

per favore, se voglio usarlo per tutte le colonne del mio df?
Mostafa,

5

L'ho fatto con una funzione. In questo caso trasformerò solo le variabili di carattere in fattore:

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

Credo che tu abbia bisogno di doppie parentesi per estrarre effettivamente la colonna e cambiarla in un fattore, ad esempio[[i]]
RTrain3k
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.