2012-10-10 12 views
13

Widziałem w kilku przypadkach, że podczas read.table() nie jest w stanie odczytać znakami tabulacji plik (na przykład stół adnotacji mikromacierzy) zwrócenie następujący błąd: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() działa idealnie na tym samym pliku bez błędów. Myślę, że również prędkość read.csv() jest wyższa niż read.table().

Jeszcze więcej: read.table() robi bardzo szalony czytając plik mnie. Powoduje to ten błąd podczas czytania linii 100, ale kiedy kopiuję i wkleja linie od 90 do 110 tuż za nagłówkiem tego samego pliku, nadal powoduje błąd linii 100 + 21 (nowe linie zostały skopiowane na początku). Jeśli jest jakiś problem z tą linią, dlaczego nie zgłosi tego błędu podczas odczytu wklejonej linii na początku? Potwierdzam, że read.csv() czyta ten sam plik bez błędu.

Czy masz pojęcie, dlaczego read.table() nie jest w stanie odczytać tych samych plików, na których działa read.csv()? Czy istnieje również jakikolwiek powód, aby używać read.table() w każdym przypadku?

+1

Przeczytaj także strona pomocy dla 'read.table()' w obszarze użycia pamięci, dlaczego może wydawać się zbyt powolna w przypadku dużych plików. – Chase

+1

nie możemy odpowiedzieć na twoje (zaktualizowane) pytanie bez odtwarzalnego przykładu. Najczęstszymi problemami z czytaniem są (1) niewykryte znaki komentarza, (2) niedopasowane znaki cudzysłowu, (3) zmiany liczby pól w wierszu po pierwszych 5 wierszach pliku, gdy 'fill = TRUE'. Ponieważ 'read.csv' i' read.table' mają różne wartości domyślne dla 'comment',' quote' i 'fill', każdy z nich może być problemem. –

+1

PS istnieje 8 kombinacji 'comment' /' quote'/'fill': możesz poeksperymentować z wszystkimi z nich i zobaczyć, jak różnią się wyniki - co może doprowadzić cię do odpowiedzi. 'count.fields()' jest również przydatny w diagnostyce. –

Odpowiedz

26

read.csv to dość cienkie opakowanie około read.table; Byłbym bardzo zaskoczony, gdyby nie można dokładnie replikować zachowania read.csv, podając poprawne argumenty do read.table. Jednak niektóre z tych argumentów (takie jak sposób obsługi cudzysłowów lub znaków komentarza) mogą zmienić szybkość i zachowanie funkcji.

W szczególności, jest to pełny definicja 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, ...) 
} 

tak jak podano to tylko read.table z określonego zestawu opcji.

Jak @Chase stwierdza w komentarzach poniżej, strona pomoc dla read.table() mówi tylko tyle pod 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

Dobra odpowiedź - chciałbym tylko dodać, że strona pomocy dla' read.table() 'mówi tak samo pod szczegółami' read.csv i read.csv2 są identyczne z read.table z wyjątkiem wartości domyślne. Są one przeznaczone do odczytu plików "oddzielonych przecinkami" (".csv") lub (read.csv2) wariantu używanego w krajach, w których jako przecinek używa się przecinka w kropce, a średnika jako separatora pól ". Tak więc do OP - tak, chcesz "odczyt.tabela", gdy twoje dane nie pasują do wartości domyślnych dla 'read.csv' – Chase

+0

Właśnie zaktualizowałem pytanie – Ali

8

Nie używaj read.table do odczytu plików tabulatorami, należy read.delim. (To jest tylko cienka owijka wokół read.table ale ustawia opcje do odpowiednich wartości)

0

read_table() zawodzi kiedyś na pliku ed karcie sep”i ustawienie sep='\s+' mogą pomóc przyjmując pozycję w tabeli nie mają miejsca

Powiązane problemy