Чтение только в части файла Stata .DTA в R - PullRequest
9 голосов
/ 11 апреля 2011

Я заранее прошу прощения, если на этот вопрос есть простой ответ.Это похоже на то, что нужно, но я не могу найти его в файлах справки, выполнив поиск SO или Googling.

Я работаю с некоторыми наборами данных, которые имеют право на несколько ГБсейчас.Этого достаточно, чтобы поместиться в память на одном из узлов кластера, к которому у меня есть доступ, но загрузка занимает совсем немного времени.Для многих действий по отладке / программированию с этими данными мне не требуется загружать весь файл, только первые несколько тысяч наблюдений, которые имеют набор данных для тестирования кода.Я, конечно, могу просто прочитать весь файл и подмножество, но мне было интересно, есть ли способ сказать read.dta(), что нужно читать только в первых N строках?Конечно, это было бы намного быстрее.

Я мог бы также использовать правильный формат, например .csv, а затем использовать аргумент nrows read.csv(), но тогда я потерял бы метки фактора в наборе данных Stata (инеобходимо воссоздать несколько ГБ данных из чужого кода, который поступает в этот проект, поэтому предпочтительным является прямое решение для файлов .dta.

Ответы [ 3 ]

9 голосов
/ 11 апреля 2011

Двоичные файлы Stata записываются построчно, поэтому вы можете изменить функцию R_LoadStataData в stataread.c, чтобы ограничить число считываемых строк. Однако это будет работать, только если вам не нужны метки значенийпотому что они написаны в конце файла и потребуют от вас прочитать весь файл - что не сэкономит время.

7 голосов
/ 11 апреля 2011

Это будет сложно, так как функция do_readStata под капотом представляет собой скомпилированный код, способный принимать только весь файл.Я считаю, что в общем случае двоичные файлы трудно читать построчно, а .dta - это двоичный формат.Кроме того, собственный двоичный формат R не позволяет выбирать количество строк из набора данных при чтении.

По моему скромному мнению, вам лучше просто создать набор тестовых файлов из Stata (напримеркод Stata sample 1000, count предоставит вам выборку из 1000 наблюдений из загруженного набора данных) и поработает с ними.И если у вас нет доступа к Stata, кто-то другой в проекте сможет сделать это за вас.

1 голос
/ 12 апреля 2011

Для продолжения работы с Joris Meys: Для такого рода вещей я использую «тестовый» набор данных и «реальный» набор данных, каждый в отдельных папках. Я держу макрос в верхней части файла .do (с инструкциями if / then ниже), чтобы (1) взять образец данных и (2) указать ввод / вывод в нужную папку, содержащую одну или другую. Я, наверное, делаю это по-разному для каждого проекта, но примерно так:

создание данных .do файл

blah blah blah 
save                  using data/myfile.dta
save if uniform()<.05 using test_data/myfile.dta   // or bsample, then save for panel data

анализ .do файл

local test = "test_"   
// when you're ready to run the file with all the data, use the following 
// local test = ""

use `test'data/myfile.dta
blah blah blah 
outreg2 ... using `test'output/mytable.txt
...