2013-06-17 11 views
12

Sto usando R per eseguire alcuni pre-elaborazione dei dati, ed ecco il problema che sto affrontando: Ho inserito i dati usando read.csv(filename,header=TRUE), e quindi lo spazio nei nomi delle variabili è diventato ".", Ad esempio una variabile chiamata Codice completo diventato Full.Code nel dataframe generato. Dopo l'elaborazione, utilizzo write.xlsx(filename) per esportare i risultati, mentre i nomi delle variabili vengono modificati. Come affrontare questo problema?Come sostituire "." nei nomi di colonna generati da read.csv() con un singolo spazio durante l'esportazione?

Inoltre, nel file di output .xlsx, la prima colonna diventa indici (vale a dire da 1 a N), che non è quello che mi aspetto.

+4

È può evitare di dover correggere i nomi chiamando 'read.csv' con l'opzione' check.names = FALSE'. –

risposta

22

Se il set check.names=FALSE in read.csv quando si leggono i dati, i nomi non verranno modificati e non sarà necessario modificarli prima di riscrivere i dati. Ciò ovviamente significa che è necessario citare i nomi delle colonne (virgolette posteriori in alcuni casi) o fare riferimento alle colonne per posizione anziché per nome durante la modifica.

+0

Penso che l'uso di 'check.names = FALSE' è una scelta migliore rispetto alla modifica dei nomi delle colonne, sebbene rileggere i dati includa molto lavoro per me. Tutto sommato, grazie per la tua risposta! Questo mi aiuta davvero molto. –

8

Per ottenere spazi di nuovo nei nomi, fare questo (a destra prima di esportare - R fa ti permettono di avere spazi nei nomi delle variabili, ma è un dolore):

# A simple regular expression to replace dots with spaces 
# This might have unintended consequences, so be sure to check the results 
names(yourdata) <- gsub(x = names(yourdata), 
         pattern = "\\.", 
         replacement = " ") 

Per eliminare l'indice prima colonna , aggiungi semplicemente row.names = FALSE al numero write.xlsx(). Questo è un argomento comune per le funzioni che scrivono i dati in formato tabellare (lo ha anche lo write.csv()).

+0

Grazie mille! La funzione 'gsub()' funziona bene. Ma ho ancora una domanda: perché dovremmo usare due _escapes_ piuttosto che semplicemente usare 'pattern =" \. "'? –

+0

@zenotsang Buona domanda - Non sono sicuro del perché R lo richieda. –

+2

Il primo escape viene utilizzato quando il parser R analizza la stringa, lasciando una \ "per l'espressione regolare. Se si ignora il parser regolare, si può ottenere una singola barra rovesciata (ma probabilmente è più lavoro di quanto valga la pena). –

3

Ecco una funzione (mi dispiace, lo so che potrebbe essere riscritta) che rende piacevoli i nomi di colonna, anche se ci sono più punti consecutivi e punti finali: utilizzo

makeColNamesUserFriendly <- function(ds) { 
    # FIXME: Repetitive. 

    # Convert any number of consecutive dots to a single space. 
    names(ds) <- gsub(x = names(ds), 
        pattern = "(\\.)+", 
        replacement = " ") 

    # Drop the trailing spaces. 
    names(ds) <- gsub(x = names(ds), 
        pattern = "()+$", 
        replacement = "") 
    ds 
} 

Esempio:

ds <- makeColNamesUserFriendly(ds)