2016-01-04 20 views
8

Ho un dataframe con circa ~ 250 variabili. Sfortunatamente, tutte queste variabili sono state importate come classi di caratteri da un database SQL utilizzando sqldf. Il problema: tutti loro non dovrebbero essere classi di personaggi. Ci sono variabili numeriche, numeri interi e date. Mi piacerebbe costruire un modello su tutte le variabili e per fare questo ho bisogno di assicurarmi che le variabili abbiano le classi giuste. Farlo uno per uno è probabilmente il migliore, ma comunque molto manuale.Qualsiasi modo per correggere automaticamente tutte le classi variabili in un dataframe

Come è possibile correggere automaticamente tutte le classi? Forse un modo per rilevare se ci sono caratteri alfabetici nella colonna o solo caratteri numerici?

Non credo sia possibile che un approccio automatico sia perfetto per correggere tutte le classi. Ma potrebbe correggere la maggior parte delle classi, quindi quelle che non sono buone, posso prendermene cura manualmente.

Aggiungo un tag sqldf nel caso in cui qualcuno conosca un modo per correggerlo durante l'importazione dei dati, ma presumo che non sia colpa di sqldf ma piuttosto del database.

risposta

8

La cosa più vicina a "automatico" tipo di conversione su una struttura di dati sarebbe probabilmente

df[] <- lapply(df, type.convert) 

dove df è il set di dati. La funzione type.convert()

Converte un vettore di caratteri in un valore logico, intero, numerico, complesso o fattore come appropriato.

Avere una lettura di help(type.convert), potrebbe essere proprio quello che vuoi.

Nella mia esperienza, type.convert() è molto affidabile. È possibile utilizzare as.is = TRUE se non si desidera che i caratteri siano forzati a fattori. Inoltre è usato internamente in molte importanti funzioni R (come read.table), quindi è sicuramente sicuro.

Ecco un rapido esempio di esso su iris. Per prima cosa modificheremo tutte le colonne in caratteri, quindi eseguiremo type.convert().

## Original column classes in iris 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "numeric" "numeric" "numeric" "numeric"  "factor" 

## Change all columns to character 
iris[] <- lapply(iris, as.character) 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "character" "character" "character" "character" "character" 

## Run type.convert() 
iris[] <- lapply(iris, type.convert) 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "numeric" "numeric" "numeric" "numeric"  "factor" 

Possiamo vedere che le colonne sono state restituite alle loro classi originali. Questo perché type.convert() obbliga le colonne al tipo "più appropriato".

+0

ciao Richard, l'ho usato di recente su un altro data frame e ha dato questo errore 'Error in FUN (X [[i]], ...): il primo argomento deve essere di carattere mode' Mi chiedevo se sapevi perché questo stava accadendo – jgozal

+0

sembra che type.convert() si aspetti un vettore di caratteri come primo argomento. Ho provato a convertire il mio df in as.character (df), ma poi convertito tutto in tipo di fattore – jgozal

+0

@jgozal Se vuoi che i caratteri rimangano caratteri e non siano forzati a fattori, imposta 'as.is = TRUE' in' .convert' –