2012-10-10 17 views
13

ho visto in diversi casi che, mentre read.table() non è in grado di leggere un file delimitato scheda (ad esempio la tabella di annotazione di un microarray) restituendo il seguente errore:read.csv vs. read.table

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
line xxx did not have yyy elements 

read.csv() funziona perfettamente sullo stesso file senza errori. Penso anche che la velocità di read.csv() sia anche superiore a read.table().

Ancora più: read.table() sta facendo molto pazzo leggendo un file di me. Rende questo errore durante la lettura della riga 100, ma quando copio e incollo le righe da 90 a 110 subito dopo la testa dello stesso file, commette comunque l'errore della riga 100 + 21 (nuove righe copiate all'inizio). Se c'è qualche problema con quella linea, perché non segnala questo errore mentre legge la riga incollata all'inizio? Confermo che read.csv() legge lo stesso file senza errori.

Avete un'idea del motivo per cui read.table() non è in grado di leggere gli stessi file che read.csv() funziona su di esso? C'è anche qualche motivo per usare read.table() in ogni caso?

+1

Anche a leggere la pagina di aiuto per 'read.table()' nell'uso della memoria sul motivo per cui può apparire lenta per file di grandi dimensioni. – Chase

+1

non possiamo rispondere alla tua domanda (aggiornata) senza un esempio riproducibile. I problemi di lettura più comuni sono (1) caratteri di commento non rilevati, (2) virgolette senza corrispondenza, (3) variazioni nel numero di campi per riga dopo le prime 5 righe del file quando 'fill = TRUE'. Poiché 'read.csv' e' read.table' hanno valori predefiniti diversi per 'comment',' quote' e 'fill', ognuno di questi potrebbe essere il problema. –

+1

PS ci sono 8 combinazioni di 'comment' /' quote'/'fill': puoi sperimentarle tutte e vedere come i risultati differiscono - questo potrebbe portarti alla risposta. 'count.fields()' è utile anche per la diagnostica. –

risposta

26

read.csv è un involucro abbastanza sottile intorno a read.table; Sarei piuttosto sorpreso se non fosse possibile replicare esattamente il comportamento di read.csv fornendo gli argomenti corretti a read.table. Tuttavia, alcuni di questi argomenti (come il modo in cui vengono gestite le virgolette oi caratteri dei commenti) potrebbero cambiare la velocità e il comportamento della funzione.

In particolare, questo è il piena definizione di read.csv:

function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) { 
    read.table(file = file, header = header, sep = sep, quote = quote, 
     dec = dec, fill = fill, comment.char = comment.char, ...) 
} 

così come dichiarato è solo read.table con un particolare insieme di opzioni.

Come @Chase afferma nei commenti qui sotto, la pagina di aiuto per read.table() dice altrettanto sotto Details:

read.csv and read.csv2 are identical to read.table except for the defaults. They are intended for reading ‘comma separated value’ files (‘.csv’) or (read.csv2) the variant used in countries that use a comma as decimal point and a semicolon as field separator.

+6

Buona risposta - Vorrei solo aggiungere che la pagina di aiuto per' read.table() 'dice tanto sotto i dettagli' read.csv e read.csv2 sono identici a read.table tranne che per le impostazioni predefinite. Sono destinati alla lettura di file 'valori separati da virgola' ('.csv') o (read.csv2) la variante utilizzata in paesi che usano una virgola come punto decimale e un punto e virgola come separatore di campo. Quindi per l'OP - sì, si vorrebbe 'read.table' quando i dati non corrispondono ai valori predefiniti per' read.csv' – Chase

+0

Appena aggiornata la domanda – Ali

8

Non utilizzare read.table di leggere i file delimitati da tabulazioni, utilizzare read.delim. (E 'solo un wrapper sottile intorno read.table ma imposta le opzioni su valori appropriati)

0

read_table() non riuscire qualche volta sulla scheda sep 'di file ed e impostando sep='\s+' può aiutare assumendo voce nella tabella hanno nessuno spazio