Sposoby odczytu tylko wybranych kolumn z pliku do R? (Wesołe medium między " Czytaj.table ' i 'scan'?) [duplikat]

To pytanie ma już odpowiedź tutaj:

Mam bardzo duże rozdzielane Pliki Danych i chcę przetwarzać tylko niektóre kolumny w R bez poświęcania czasu i pamięci na tworzenie data.frame dla całego pliku.

Jedyne opcje jakie znam to {[1] } które są bardzo marnotrawne kiedy chcę tylko kilka kolumn lub scan, które wydają się zbyt niski poziom dla tego, czego chcę.

Czy jest lepsza opcja, albo z czystym R, albo może wywołanie innego skryptu powłoki do ekstrakcji kolumn, a następnie za pomocą skanowania lub odczytu.tabela wyników? (Co prowadzi do pytania jak wywołać skrypt powłoki i uchwycić jego wyjście w R?).

Author: Blue Magister, 2010-02-03

4 answers

Czasami robię coś takiego, gdy mam dane w pliku rozdzielanym tabulatorami:

df <- read.table(pipe("cut -f1,5,28 myFile.txt"))

To pozwala cut dokonać wyboru danych, co może zrobić bez użycia dużej ilości pamięci.

Zobacz Tylko odczyt ograniczonej liczby kolumn dla wersji czystej R, używając "NULL" w argumencie colClasses do read.table.

 34
Author: Ken Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-06 15:47:02

Jedną z możliwości jest użycie pipe() zamiast nazwy pliku i posiadanie awk lub podobnych filtrów wyodrębnia tylko te kolumny, które chcesz.

Zobacz help(connection) aby dowiedzieć się więcej o pipe i przyjaciołach.

Edytuj: read.table() można to również zrobić za Ciebie, jeśli jesteś bardzo wyraźny o colClasses - wartość NULL dla danej kolumny pomija kolumnę alltogether. Zobacz help(read.table). Mamy więc rozwiązanie w base R bez dodatkowych pakietów i narzędzi.

 18
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 17:59:53

Myślę, że podejście Dirka jest proste i szybkie. Alternatywą, której użyłem, jest załadowanie danych do sqlite, który ładuje się znacznie szybciej niż odczyt.table (), a następnie wyciągnij tylko to, co chcesz. pakiet sqldf () ułatwia to wszystko. Oto link {[2] } do poprzedniej odpowiedzi na przepełnienie stosu, która zawiera przykłady kodu dla sqldf ().

 7
Author: JD Long,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:06

Jest to prawdopodobnie więcej niż potrzebujesz, ale jeśli pracujesz na bardzo dużych zestawach danych , Możesz również przyjrzeć się Pakietowi HadoopStreaming, który zapewnia rutynę map-reduce za pomocą Hadoop.

 3
Author: Shane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 17:16:20