2013-05-27 37 views
1

我有53個Stata .dta文件,每個文件都是150-200 Mb,包含相同的一組變量,但不同年份。由於它們的大小,將它們合併或合併是沒有用的。如何從多個Stata文件中檢索數據?

我需要找回一些平均所以,我想創建一個新的Stata文件New.dta,寫一個.do文件,將通過以下方式對新的Stata文件運行值(百分比等):它應該打開每個那些53個Stata的文件,使某些calulations,並存儲在新的Stata文件中的結果,New.dta.

我不知道我怎麼能保持2 Stata的文件打開simultaneuosly,我怎麼可以存儲計算值?

當我打開第二個.dta文件時,如何使第一個文件仍然打開?我如何將計算值存儲在全局變量中?

回答

4

這裏要介紹的是使用postfile

這是一個簡單的例子。首先,我設置了幾個數據集的示例。你已經有了這個。

clear 

forval i = 1/10 { 
    set obs 100 
    gen foo = `i' * runiform() 
    save test`i' 
    clear 
} 

現在我成立了postfile。我需要設置一個句柄,將使用哪些變量以及將使用哪個文件。儘管我使用數字變量來保存文件標識符,但使用字符串變量可能更典型。此外,循環播放文件名可能比這更具挑戰性。來自SSC的fs是一種便利的命令,可以幫助將一組文件名放入本地宏;這裏沒有說明它的用法。

postfile mypost what mean using alltest.dta 

forval i = 1/10 { 
    use test`i', clear 
    su foo, meanonly 
    post mypost (`i') (`r(mean)') 
} 

現在刷新結果

postclose mypost 

,看看我們有什麼。

u alltest 

list 

    +-----------------+ 
    | what  mean | 
    |-----------------| 
    1. | 1 .5110765 | 
    2. | 2 1.016858 | 
    3. | 3 1.425967 | 
    4. | 4 2.144528 | 
    5. | 5 2.438035 | 
    |-----------------| 
    6. | 6 3.030457 | 
    7. | 7 3.356905 | 
    8. | 8 4.449655 | 
    9. | 9 4.381101 | 
10. | 10 5.017308 | 
    +-----------------+ 

這裏我沒有使用任何全局宏(不是全局變量)你不需要。

+0

非常感謝...我嘗試過......但仍然得到'發佈mypost找不到'。我試着創建'mypost.dta' ...仍然是同樣的錯誤。是'mypost.dta'的目標文件嗎? – Buras

+0

你將不得不發佈你試過的代碼。否則,我只能建議你有一個語法錯誤。 –

+0

我已經添加了我在上面的問題中嘗試的代碼...佈局在評論部分不好... – Buras

4

另一種方法是循環播放文件,並使用collapse將這些文件「濃縮」爲相關方式,而不是將這些濃縮文件壓縮到append。這裏是尼克的例子改編:

// create the example datasets 
clear 

forval i = 1/10 { 
    set obs 100 
    gen foo = `i' * runiform() 
    gen year = `i' 
    save test`i', replace 
    clear 
} 

// use collapse and append 
// to create the dataset you want 
use test1, clear 
collapse (mean) year foo 
save means, replace 
forvalues i = 2/10 { 
    use test`i', clear 
    collapse (mean) year foo 
    append using means 
    save means, replace 
} 

// admire the result 
list 
+0

這是一個很好的方法,可能會更容易理解。正如馬爾滕高興地強調的那樣,它嚴格限於「崩潰」可以做的事情。但是,如果你喜歡這條路線,也要注意'合同'。 –

1

請注意,如果您的數據集未命名順序像test1.dtatest2.dta,...,test53.dta,而是像results-alaska.dtaresult_in_alabama.dta,...,"wyoming data.dta"(注的空間,因此不包括引號),你就必須對這些文件整理週期有所不同:

local allfiles : dir . files "*.dta" 
foreach f of local allfiles { 
    use `"`f'"', clear 
    * all other code from Maarten's or Nick's approach 
} 

這是一種更先進的本地宏,見help extended macro functions。還要注意的是,Stata會生成一個類似"results-alaska.dta" "result_in_alabama.dta" "wyoming data.dta"的列表,並在文件名稱周圍加上引號,因此當您調用use時,您必須將文件名放在compound quotes中。