2013-06-07 8 views
37

Mam duży zestaw danych, który składa się z około 94 kolumn i 3 milionów wierszy. Ten plik ma pojedyncze i wiele spacji jako ogranicznik między kolumnami. Muszę przeczytać kilka kolumn z tego pliku w R. Z tego Próbowałem za pomocą read.table() z opcjami, które można zobaczyć w poniższym kodzie, kod jest wklejony below-Czytanie pliku tekstowego z wieloma spacjami jako ogranicznikiem w R

### Defining the columns to be read from the file, the first 5 column, then we do not read next 24, after this we read next 5 columns. Last 60 columns are not read in- 

    col_classes = c(rep("character",2), rep("numeric", 3), rep("NULL",24), rep("numeric", 5), rep("NULL", 60)) 

### Reading first 100 rows of the data 

    data <- read.table(file, sep = " ",header = F, nrows = 100, na.strings ="", stringsAsFactors= F) 

ponieważ plik, który musi czytać ma więcej niż jedną spację jako ogranicznik między niektórymi kolumnami, powyższa metoda nie działa. Czy istnieje metoda, za pomocą której możemy sprawnie czytać w tym pliku.

+1

Wystarczy usunąć argument "sep =" "'. 'read.table' domyślnie wie, jak obsługiwać wiele spacji. –

+0

Mam bardzo podobny problem, ale potrzebuję bardziej ogólnego rozwiązania, ponieważ mam pojedyncze przestrzenie na niektórych polach. Oznacza to, że powinienem być w stanie ustawić minimalną liczbę kolejnych spacji (w moim przypadku 2), aby były traktowane jako separatory, bez limitu. – EdM

+0

Powiązany post: https://stackoverflow.com/questions/30955464/reading-aligned-column-data-with-fread – zx8754

Odpowiedz

49

Musisz zmienić ogranicznik. " " odnosi się do jednej białej spacji. "" odnosi się do dowolnej długości spacji jako separatora

data <- read.table(file, sep = "" , header = F , nrows = 100, 
        na.strings ="", stringsAsFactors= F) 

z podręcznika:

If sep = "" (the default for read.table) the separator is ‘white space’, that is one or more spaces, tabs, newlines or carriage returns.

Również z dużym pliku danych może warto rozważyć data.table:::fread szybko odczytać dane prosto do data.table . Sam używałem tej funkcji dziś rano. Nadal jest eksperymentalna, ale uważam, że działa bardzo dobrze.

+0

w jaki sposób "fread" obsługuje wiele spacji? To była pierwsza funkcja odczytu, której próbowałem używać, ale dla mnie nie powiodło się z powodu wielu spacji, jakiejkolwiek pracy nad tym? – Pawan

+0

@ user2412678 Czy próbowałeś 'fread (..., sep =" ")' lub alternatywnie możesz spróbować 'fread (..., sep =" \ s ")', ale nie wiem, czy to zadziała. Mógłbyś wypróbować oba i złożyć raport, a następnie możemy zaktualizować odpowiedź na 'fread', jeśli jedna z nich zadziała. –

+4

'fread (..., sep =" ")' nie działa w 'fread', otrzymujemy następujący błąd, gdy używamy tego -' Błąd w fread (file, sep = "",: 'sep' musi być "auto" lub pojedynczym znakiem '' fread (...., sep = "\ s") 'nie działa w' fread', otrzymujemy następujący błąd w tym przypadku 'Błąd: '\ s' jest nierozpoznana ucieczka w łańcuchu znaków zaczynającym się od "" \ s "' Jednak 'fread (..., sep =" ")' działa, ale to nie rozwiązuje problemu wielu przestrzeni jako ogranicznika, traktuje wiele spacji jako kolumnę – Pawan

1

Jeśli pole ma stałą szerokość, należy rozważyć użycie read.fwf(), które może lepiej poradzić sobie z brakującymi wartościami.

Powiązane problemy