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

#r #stata #processing-efficiency

#r #stata #эффективность обработки

Вопрос:

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

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

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

Комментарии:

1. Возможно, стоит указать вашему коллеге, использующему stata, в направлении outsheet функции для экспорта в CSV. Возможно, немного поздновато для этого проекта, но это может облегчить вашу совместную работу в следующий раз. ats.ucla.edu/stat/stata/faq/outsheet.htm

Ответ №1:

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

Ответ №2:

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

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

Комментарии:

1. Облом, но спасибо. Я полагаю, что это теоретически возможно, хотя, потому что вы можете сделать это в Stata с помощью чего-то вроде use myfile.dta in 1/1000 . Я стараюсь максимально придерживаться R, но могу просто статизировать тестовые наборы.

2. @gsk3 : это возможно, если вы взломаете исходный код внешнего пакета, как объяснил Джошуа, но вам нужно найти способ прочитать также конец файла, чтобы получить метки.

Ответ №3:

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

создание данных.выполнить файл

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

файл analysis .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