Чтение только в части статы.Файл DTA в R


Заранее прошу прощения, если где-то есть простой ответ. Это похоже на то, что было бы, но я не могу найти его в файлах справки, ища так или Гугля.

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

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

3 9

3 ответа:

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

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

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

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

Создание данных. do file

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 file

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