2011-04-11 76 views
9

中Stata .DTA文件的一部分如果在某個地方有一個簡單的答案,請提前道歉。這似乎是這樣的事情,但我似乎無法通過搜索或谷歌搜索找到它的幫助文件。只讀R

我正在處理幾個數據集,現在有幾個GB。這足以適應我有權訪問的某個羣集節點的內存,但需要相當多的時間才能加載。對於使用這些數據的許多調試/編程活動,我不需要加載整個文件,只需要前幾千個觀測數據就可以得到一個數據集來測試代碼。我當然可以讀取整個文件和子集,但是我想知道是否有辦法告訴read.dta()只能讀取前N行?這當然會快得多。

我也可以使用合適的格式,例如.csv,然後使用read.csv()的nrows參數,但是我會丟失Stata數據集中的因子標籤(並且必須重新創建其他人的幾GB數據因此,直接解決.dta文件是首選。

+1

這可能是值得您的指點stata-using-colleague在'outsheet'函數的方向上導出爲CSV。也許這個項目有點晚了,但下次你們一起工作時可能會更容易些。 http://www.ats.ucla.edu/stat/stata/faq/outsheet.htm – 2011-04-11 17:10:48

回答

9

Stata的二進制文件是逐行寫入的,因此您可以更改stataread.c中的R_LoadStataData函數來限制讀入的行數。但是,只有在您不需要值標籤時才能使用它,因爲它們是寫在文件末尾,並要求你閱讀整個文件 - 這不會節省任何時間。

+1

+1爲'使用來源,盧克!' – 2011-04-11 13:53:25

+0

另請參閱:http://www.stata.com/help.cgi?dta其中描述了這一點。 – 2011-04-11 13:56:37

7

這將是一個困難的,因爲引擎蓋下的do_readStata函數是編譯代碼,只能夠在整個文件。我相信一般二進制文件很難逐行閱讀,.dta是一種二進制格式,並且R的本地二進制格式不允許在讀入時從數據集中選擇多行。

根據我的愚見,你可以更好地從Stata內創建一組測試文件(例如,Stata代碼sample 1000, count會給你一個來自加載數據集的1000個觀察結果的樣本),並與他們一起工作。如果您無法訪問Stata,項目中的其他人應該可以爲您做到這一點。

+0

Bummer,但謝謝。不過,我認爲這在理論上是可行的,因爲你可以在Stata中使用類似'use myfile.dta in 1/1000'的方法來做到這一點。我試圖儘可能地堅持R,但我可能只是去測試套件。 – 2011-04-11 17:57:09

+0

@ gsk3:正如Joshua解釋的那樣,如果你侵入外部軟件包的源代碼是可能的,但你需要找到一種方法來讀取文件的結尾以及獲取標籤。 – 2011-04-11 21:21:22

1

爲了跟進Joris Meys:對於這類事情,我使用「測試」數據集和「真實」數據集,每個數據集放在不同的文件夾中。我將一個宏保存在.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 

分析。做文件

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