我有53个Stata .dta
文件,每个文件都是150 - 200 Mb并且包含相同的变量集,但是不同年份。由于它们的大小,将它们组合或合并是没有用的。
我需要检索一些平均值(百分比等)因此,我想创建一个新的Stata文件New.dta
并编写一个.do
文件,该文件将在以下新的Stata文件上运行方式: 它应该打开这53个Stata文件中的每一个,进行某些计算,并将结果存储在新的Stata文件中,New.dta.
我不确定如何保持两个Stata文件同时打开,如何存储计算值?
当我打开第二个.dta文件时,如何让第一个仍然打开?如何将计算值存储在全局变量中?
答案 0 :(得分: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 |
+-----------------+
我这里没有使用任何全局宏(不是全局变量);你不应该这样做。
答案 1 :(得分: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
答案 2 :(得分:1)
请注意,如果您的数据集未按顺序命名,例如test1.dta
,test2.dta
,...,test53.dta
,而是results-alaska.dta
,result_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中。