2014-10-20 11 views
6

Chciałbym zaimportować pliki CSV do R, z pierwszą niepustą linią dostarczającą nazwy kolumn ramki danych. Wiem, że możesz podać argument skip = 0, aby określić, która linia zostanie odczytana jako pierwsza. Jednak numer wiersza pierwszej niepustej linii może się zmieniać między plikami.Pomiń wszystkie wiodące puste wiersze w read.csv

Jak mogę sprawdzić, ile wierszy jest pustych i dynamicznie pomijać je dla każdego pliku?

Jak wskazano w komentarzach, muszę wyjaśnić, co oznacza "puste". Moje pliki CSV wyglądają następująco:

,,, 
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 

co oznacza, że ​​na początku są rzędy przecinków.

Odpowiedz

7

read.csv automatycznie pomija puste linie (chyba że ustawisz blank.lines.skip=FALSE). Po wpisaniu powyższego, plakat wyjaśnił, że puste linie nie są w rzeczywistości puste, ale zawierają przecinki, ale nic między przecinkami. W takim przypadku użyj fread z pakietu data.table, który to obsłuży. skip= argument może być ustawione na dowolny ciąg znaków znaleziony w nagłówku:

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

Ostatnia linia może zostać pominięty, jeżeli data.table jest ok jak zwracanej wartości.

+1

dobry połów. Tak długo, jak "puste" linie są całkowicie puste od jakichkolwiek znaków, tak powinno działać. PO powinien prawdopodobnie wyjaśnić charakter ich danych. – thelatemail

+0

Próbowałem użyć 'blank.lines.skip = TRUE' i zastanawiałem się, dlaczego to nie zadziałało. Okazuje się, że puste linie zawierają przecinki. – Alex

+0

Czy jest jakikolwiek minus pomijania pustych linii w działaniu? - - W każdej próbie mam co drugą linię pustą, w rzeczywistości każda linia nieparzysta jest pusta. - - Lubię przechowywać dane tak oryginalne, jak to tylko możliwe. –

2

W zależności od rozmiaru pliku może to nie być najlepsze rozwiązanie, ale wystarczy.

Strategia polega na tym, że zamiast czytać plik z ogranicznikiem, odczyta się jako linie, i policzy znaki i zapisuje do temp. Następnie, podczas gdy pętla będzie szukała pierwszej niezerowej długości znaku na liście, , wówczas odczyta plik i zapisze go jako nazwa_pliku_danych.

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) 
} 

Jeśli plik zawiera nagłówków, można zacząć i od 2.

2

Jeśli pierwsza para pustych wierszy jest naprawdę pusta, wówczas read.csv powinna automatycznie przejść do pierwszego wiersza. Jeśli mają przecinki, ale żadnych wartości, to można użyć:

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

To nie jest skuteczny, jeśli masz duże pliki (ponieważ trzeba importować dwukrotnie), ale działa.

Jeśli chcesz zaimportować plik tabulatorami z tym samym problemem (zmienna puste linie), a następnie użyć:

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

na miejscu z przecinkami, ale to również działałoby z kartą oddzieloną tak jak w prawo? – Alex

+0

Nie z funkcją 'read.csv'. Otrzymasz błąd, ponieważ funkcja szuka przecinków. – CephBirk