2013-06-06 12 views
7

Ho un file csv in cui i nomi delle colonne includono spazi e caratteri speciali.dal pacchetto data.table quando i nomi delle colonne includono spazi e caratteri speciali?

fread li importa con virgolette - ma come posso modificare questo comportamento? Una ragione è che ho nomi di colonne che iniziano con uno spazio e non so come gestirli.

Qualsiasi suggerimento sarebbe utile.

Modifica: un esempio.

> packageVersion("data.table") 
[1] ‘1.8.8’ 

p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE) 

> head(p2p[,list(Principal remaining)]) 
Error: unexpected symbol in "head(p2p[,list(Principal remaining" 

> head(p2p[,list("Principal remaining")]) 
        V1 
1: Principal remaining 

> head(p2p[,list(c("Principal remaining"))]) 
        V1 
1: Principal remaining 

quello che mi aspettavo/mancanza è, naturalmente, quello che un nome di colonna senza spazi rendimenti:

> head(p2p[,list(Principal)]) 
    Principal 
1:  1000 
2:  1000 
3:  1000 
4:  2000 
5:  1000 
6:  4130 

risposta

5

Dovrebbe essere piuttosto difficile da ottenere uno spazio iniziale in un nome di colonna. Non dovrebbe accadere con "codice casuale". D'altra parte non vedo molto controllo degli errori nel codice fread, così forse fino a quando questo comportamento indesiderato è fisso, (o la richiesta di funzionalità rifiutato), si può fare qualcosa di simile:

setnames(DT, make.names(colnames(DT))) 

Se d'altra parte sei infastidito dal fatto che colnames(DT) mostrerà i nomi delle colonne con le virgolette e poi semplicemente "superalo". Ecco come la console interattiva mostrerà qualsiasi valore di carattere.

Se si dispone di un elemento di dati in una colonna personaggio che assomiglia " ttt" in originale, quindi sta andando ad avere spazi iniziali in caso di importazione, ed è necessario elaborare con colnames(dfrm) <- sub("^\\s+", "", colnames(dfrm)) o uno dei numerosi trim funzioni in vari pacchetti (ad esempio 'GData')

+0

Cercherò il percorso sub/gsub. Grazie. – Rico

+0

Si consiglia di aggiornare la risposta con questo. 'Messaggio di avviso: Nei nomi <-. Data.table (* tmp *, valore = valore): La sintassi dei nomi (x) <- valore copia l'intera tabella. Questo è dovuto a <- nella R stessa. Per favore cambia in setnames (x, vecchio, nuovo) che non copia ed è più veloce. Vedi help ('setnames'). Puoi tranquillamente ignorare questo avvertimento se è inopportuno cambiare in questo momento. Le opzioni di impostazione (warn = 2) trasformano questo avviso in un errore, quindi puoi usare traceback() per trovare e modificare i tuoi nomi <- calls. – Rico

+0

Punto eccellente e ho modificato la risposta per riflettere questo. –

9

Un po 'modificato versione BondedDust, perché la funzione setnames non viene utilizzato con < - segno:

setnames(DT, make.names(colnames(DT)) 
+0

Buono. Fixato David Arenburg. Sono piuttosto imbarazzato dal fatto che l'ho fatto e ho stupito che l'errore persistesse per oltre un anno. –

0

è possibile utilizzare check.names argomento = T in funzione fread di data.table

p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE, check.names=T) 

Esso utilizza la funzione in background make.names

default is FALSE. If TRUE then the names of the variables in the data.table 
are checked to ensure that they are syntactically valid variable names. If 
necessary they are adjusted (by make.names) so that they are, and also to 
ensure that there are no duplicates. 
Problemi correlati