2011-12-26 7 views
9

Sto cercando di leggere this file (3,8 MB) usando la sua struttura a larghezza fissa come descritto in the following link.read.fwf e il segno di numero

Questo comando:

a <- read.fwf('~/ccsl.txt',c(2,30,6,2,30,8,10,11,6,8)) 

Produce un errore:

line 37 did not have 10 elements

Dopo replicare la questione con diversi valori della opzione skip, ho pensato che le linee che causa il problema contengono tutti il ​​"# "simbolo.

C'è un modo per aggirarlo?

+1

+1 Grazie per aver scritto una buona domanda che include le informazioni di cui abbiamo bisogno per rispondere alla domanda. –

risposta

11

Come già commentato da @jverzani, questo problema è probabilmente il fatto che il # segno spesso usato come carattere per segnalare un commento. L'impostazione dell'argomento di input comment.char di read.fwf su un valore diverso da # potrebbe risolvere il problema. Lascerò la mia risposta di seguito come un caso più generale che è possibile utilizzare su qualsiasi personaggio che causa problemi (ad esempio lo 's nel nome della città olandese 's Gravenhage).

Ho riscontrato questo problema con altri simboli. L'approccio che ho preso è stato semplicemente sostituire il # con niente o con un personaggio che non genera l'errore. Nel mio caso non è stato un problema sostituire semplicemente il personaggio, ma questo potrebbe non essere possibile nel tuo caso.

Quindi il mio approccio sarebbe quello di eliminare il simbolo che genera l'errore o sostituire con un altro carattere. Questo può essere fatto usando un editor di testo (trova e sostituisci), in uno script R, o usando alcuni strumenti di linux chiamati grep e sed. Se si desidera eseguire questa operazione in uno script R, utilizzare scan o readLines per leggere le righe. Una volta che il testo è in memoria, è possibile utilizzare sub per sostituire il carattere.

Se non è possibile sostituire il carattere, proverei il seguente approccio: sostituire il carattere con un carattere che non genera un errore, leggerlo in R utilizzando read.fwf e infine sostituire il carattere con il carattere #.

+5

Penso che passare un carattere di commento diverso, ad esempio con comment.char = "", funzionerebbe. (vedi read.table) – jverzani

+0

Se potessi aggiungere questo come risposta, sarebbe fantastico! La mia risposta è un po 'più generica, in quanto funziona anche per i problemi relativi ai personaggi (ho avuto questo problema con i nomi delle città olandesi). –

+0

Grazie, @jverzani ha risolto il problema. – Alex

4

In seguito alla risposta di cui sopra: per ottenere tutti i caratteri da leggere come letterali, utilizzare sia comment.char="" e quote="" (quest'ultimo si prende cura di @ di PaulHiemstra problema con apici singoli in nomi propri olandese) nella chiamata a read.fwf (questo è documentato in ?read.table).

+0

Quando si utilizza quote = "" in read.fwf, viene visualizzato un errore: Errore in read.table (file = FILE, header = header, sep = sep, row.names = row.names,: argomento formale "quote" corrispondente a più argomenti effettivi – panterasBox

+0

hai ragione - 'quote =" "' non dovrebbe * essere necessario *, poiché 'read.table' viene chiamato internamente con' quote = "" '. Se hai un problema relativo a ma distinto da questo, vai avanti e posta un'altra domanda ... –

Problemi correlati