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

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

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

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


person Ari B. Friedman    schedule 11.04.2011    source источник
comment
Возможно, стоит указать вашему коллеге, использующему stata, направление функции outsheet для экспорта в CSV. Возможно, немного поздно для этого проекта, но это может облегчить вашу следующую совместную работу. ats.ucla.edu/stat/stata/faq/outsheet.htm< /а>   -  person Richie Cotton    schedule 11.04.2011


Ответы (3)


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

person Joshua Ulrich    schedule 11.04.2011

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

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

person Joris Meys    schedule 11.04.2011
comment
Облом, но спасибо. Я полагаю, что теоретически это возможно, потому что вы можете сделать это в Stata с чем-то вроде use myfile.dta in 1/1000. Я стараюсь максимально придерживаться R, но я могу просто использовать статистические наборы тестов. - person Ari B. Friedman; 11.04.2011
comment
@gsk3 gsk3: это возможно, если вы взломаете источник чужого пакета, как объяснил Джошуа, но вам также нужно найти способ прочитать конец файла, чтобы получить метки. - person Joris Meys; 12.04.2011

В продолжение Джориса Мейса: для такого рода вещей я использую «тестовый» набор данных и «реальный» набор данных, каждый в отдельных папках. Я держу макрос в верхней части файла .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
person Keith    schedule 12.04.2011