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
risposta
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
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
@Rasoul, 'mydf [, nomi_col]' lo farà – DrDom
+ 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. –
# 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)
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. –
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
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]'. –
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
)
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. –
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
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. –
pls se voglio usarlo per tutte le colonne del mio df? –
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])
}
}
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn) –
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
Un modo per farlo automaticamente per tutte le variabili di caratteri, dato che data.frame lo fa con stringheAsFactors? –