2011-04-11 19 views
9

Pido disculpas por adelantado si tiene una respuesta simple en alguna parte. Parece que es el tipo de cosa que lo haría, pero parece que no puedo encontrarlo en los archivos de ayuda, al buscar SO, o al buscar en Google.Lectura solo en una parte de un archivo Stata .DTA en R

Estoy trabajando con algunos conjuntos de datos que son varios GB en este momento. Es suficiente para caber en la memoria en uno de los nodos del clúster al que tengo acceso, pero lleva bastante tiempo cargarlo. Para muchas actividades de depuración/programación con estos datos, no necesito cargar todo el archivo, solo los primeros miles de observaciones que tienen un conjunto de datos para probar el código. Por supuesto, puedo leer todo el archivo en un subconjunto, pero me preguntaba si hay una forma de decirle a read.dta() que solo lea en las primeras N filas. Esto, por supuesto, sería mucho más rápido.

También podría usar un formato adecuado como .csv y luego usar read.csv() en el argumento nrows, pero luego perdería las etiquetas de factores en el conjunto de datos Stata (y tendría que recrear bastantes GB de datos de otra persona código que se está incorporando a este proyecto. Por lo tanto, se prefiere una solución directa en archivos .dta

+1

que valdría la pena señalar que su Stata-using-colega en la dirección de la función 'outsheet' para exportar a CSV. Un poco tarde para este proyecto, tal vez, pero podría hacerlo más fácil la próxima vez que trabajen juntos. http://www.ats.ucla.edu/stat/stata/faq/outsheet.htm –

Respuesta

9

archivos binarios de Stata se escriben fila por fila, por lo que podría cambiar la función R_LoadStataData en stataread.c para limitar el número de filas leídas. Sin embargo, esto sólo funcionará si usted no necesita las etiquetas de valor, ya que son escrito al final del archivo y requeriría que leyeras el archivo completo, lo que no ahorraría tiempo.

+1

+1 por '¡Usa la fuente, Lucas!' –

+0

Vea también: http://www.stata.com/help.cgi?dta donde se describe esto. –

7

Eso va a ser difícil, ya que la función do_readStata bajo el capó es código compilado, solo capaz de tomar todo el archivo Creo que, en general, los archivos binarios son difíciles de leer línea por línea, y .dta es un formato binario. Además, el formato binario nativo de R no permite seleccionar un número de líneas del conjunto de datos mientras se lee.

En mi humilde opinión, que mejor puede simplemente crear un conjunto de archivos de prueba desde el interior de Stata (por ejemplo, el código de Stata sample 1000, count le dará una muestra de 1000 observaciones del conjunto de datos cargado), y trabajar con ellos. Y si no tiene acceso a Stata, alguien más en el proyecto debería poder hacer eso por usted.

+0

Bummer, pero gracias. Me imagino que es teóricamente posible, sin embargo, porque puedes hacerlo en Stata con algo como 'use myfile.dta en 1/1000'. Trato de seguir con R tanto como sea posible, pero puedo pasar a Stata -ize los sets de prueba. –

+0

@ gsk3: es posible si ingresas al origen del paquete externo, como explicó Joshua, pero también debes encontrar la manera de leer el final del archivo para obtener las etiquetas. –

1

Para dar seguimiento a Joris Meys: Para este tipo de cosas, yo uso un conjunto de datos de "prueba" y el conjunto de datos "real", cada uno en carpetas separadas. Guardo una macro en la parte superior del archivo .do (con declaraciones if/then a continuación) para (1) tomar una muestra de los datos y (2) puntos de entrada/salida a la carpeta derecha que contiene uno u otro. Probablemente lo haga diferente para cada proyecto, pero algo como esto:

creación de datos .do presento análisis

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 archivo

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 
Cuestiones relacionadas