2014-10-20 10 views
6

Desidero importare file csv in R, con la prima riga non vuota che fornisce il nome delle colonne del frame di dati. So che è possibile fornire l'argomento skip = 0 per specificare quale riga leggere per prima. Tuttavia, il numero di riga della prima riga non vuota può cambiare tra i file.Salta tutte le righe vuote iniziali in read.csv

Come calcolare quante righe sono vuote e saltarle dinamicamente per ogni file?

Come indicato nei commenti, ho bisogno di chiarire cosa significa "vuoto". I miei file CSV assomigliano a:

,,, 
w,x,y,z 
a,b,5,c 
a,b,5,c 
a,b,5,c 
a,b,4,c 
a,b,4,c 
a,b,4,c 

che significa che ci sono righe di virgole all'inizio.

risposta

7

read.csv salta automaticamente righe vuote (a meno che non si imposta blank.lines.skip=FALSE). Vedi ?read.csv

Dopo aver scritto quanto sopra, il poster ha spiegato che le righe vuote non sono effettivamente vuote ma contengono virgole ma nulla tra le virgole. In tal caso, utilizzare fread dal pacchetto data.table che gestirà quello. L'argomento skip= può essere impostato a qualsiasi stringa di caratteri trovato nell'intestazione:

library(data.table) 
DT <- fread("myfile.csv", skip = "w") # assuming w is in the header 
DF <- as.data.frame(DT) 

l'ultima riga può essere omesso se un data.table è ok come valore restituito.

+1

Buona cattura. Finché le righe "vuote" sono completamente vuote di qualsiasi personaggio, questo dovrebbe funzionare. L'OP dovrebbe probabilmente chiarire la natura dei loro dati. – thelatemail

+0

Ho provato a usare 'blank.lines.skip = TRUE', e mi stavo chiedendo perché non ha funzionato. Risulta che le righe vuote contengono virgole. – Alex

+0

C'è qualche segno negativo di saltare le linee vuote nelle prestazioni? - - Ho ogni seconda linea vuota nel mio tentativo, in realtà ogni linea dispari è vuota. - - Mi piace mantenere i dati il ​​più originali possibile. –

2

A seconda delle dimensioni del file, questa potrebbe non essere la soluzione migliore ma farà il lavoro.

La strategia qui è, anziché leggere il file con delimitatore, leggerà come linee, e conterebbe i caratteri e li memorizzerà in temp. Quindi, mentre il ciclo cercherà la prima lunghezza di carattere diversa da zero nell'elenco, leggerà il file e lo memorizzerà come data_filename.

flist = list.files() 
for (onefile in flist) { 
    temp = nchar(readLines(onefile)) 
    i = 1 
    while (temp[i] == 0) { 
    i = i + 1 
    } 
    temp = read.table(onefile, sep = ",", skip = (i-1)) 
    assign(paste0(data, onefile), temp) 
} 

Se il file contiene le intestazioni, è possibile parto da 2.

2

Se la prima coppia di righe vuote è veramente vuota, allora read.csv dovrebbe saltare automaticamente alla prima riga. Se hanno le virgole, ma nessun valore, allora si può usare:

df = read.csv(file = 'd.csv') 
df = read.csv(file = 'd.csv',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 

Non è efficace se si dispone di file di grandi dimensioni (poiché è necessario importare due volte), ma funziona.

Se si desidera importare un file delimitato da tabulazioni con lo stesso problema (righe vuote variabile) quindi utilizzare:

df = read.table(file = 'd.txt',sep='\t') 
df = read.table(file = 'd.txt',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 
+0

azzeccati con le virgole, ma funzionerebbe anche con tab separato e giusto? – Alex

+0

Non con la funzione 'read.csv'. Riceverai un errore poiché la funzione sta cercando le virgole. – CephBirk