我在Stata有大约100个数据集。我想遍历所有这些,以获得一个汇总表,用于所有数据集中服用药物aceinhib的人的比例。 我可以编写代码为每个数据集生成一个表,但我想要的是一个表中所有这些表的摘要。
下面是仅使用 5 个数据集的示例:
forval i=1/5 {
capture use "FILEADDRESSFILENAME`i'", clear
table aceinhib
capture save "FILEADDRESSNEW_FILENAME`i'", replace
}
这给了我:
----------------------
aceinhib | Freq.
----------+-----------
0 | 1578935
1 | 138,961
----------------------
----------------------
aceinhib | Freq.
----------+-----------
0 | 5671774
1 | 421,732
----------------------
----------------------
aceinhib | Freq.
----------+-----------
0 | 2350391
1 | 198,875
----------------------
----------------------
aceinhib | Freq.
----------+-----------
0 | 884,660
1 | 51,087
----------------------
----------------------
aceinhib | Freq.
----------+-----------
0 | 1470388
1 | 130,614
----------------------
我想要的是:
----------------------
aceinhib | Freq.
----------+-----------
0 | 11956148
1 | 941269
----------------------
——即上述5个表格的综合结果。
考虑以下模式:
scalar a = 0
scalar b = 0
quietly forval i = 1/1000 {
sysuse auto, clear
count if foreign
scalar a = scalar(a) + r(N)
count if !foreign
scalar b = scalar(b) + r(N)
}
gen double count = cond(_n == 1, scalar(a), cond(_n == 2, scalar(b), .))
gen which = cond(_n == 1, "Foreign", cond(_n == 2, "Domestic", ""))
list which count in 1/2
只需将计数从一个文件累积到另一个文件即可。对于真正的问题,不要重复读取相同的数据集,而是循环读取不同的文件。
也许这会为你指出一个有用的方向。
clear
tempfile working
save `working', emptyok
forval i=1/5{
quietly use "FILEADDRESSFILENAME`i'", clear
* replace "somevariable" with the name of a variable that is never missing
collapse (count) N=somevariable, by(aceinhib)
append using `working'
quietly save `working', replace
}
use `working', clear
collapse (sum) N, by(aceinhib)
list
如果所有文件都具有相同的结构,则可以在table
命令之前将它们append
到一个文件中。以下解决方案还依赖于将aceinhib
编码为 0/1。如果文件不是太大而无法追加,则可以像以下那样简单:
use "FILEADDRESSFILENAME1", clear
forvalues i = 2/100 {
append using "FILEADDRESSFILENAME`i'"
}
table aceinhib
如果从append
生成的数据文件太大,并且不涉及权重,则可以继续使用replace
选项进行table
:
forvalues i = 1/100 {
use "FILENAME`i'", clear
table aceinhib, replace
rename table1 freq
save "NEW_FILENAME`i'"
}
use "NEW_FILENAME1", clear
forvalues i = 2/100 {
append using "NEW_FILENAME`i'"
}
collapse (sum) freq, by(aceinhib)
list
请注意,此方法将创建包含各个频率表的数据文件。第三种方法依赖于将循环每次迭代的tab
结果存储到矩阵中,并将它们添加到另一个矩阵中以存储每个数据集中aceinhib的累积频率为0/1值:
mat b = (0 )
forvalues i = 1/100 {
use "`FILENAME`i''", clear
tab aceinhib, matcell(aceinhib`i')
mat aceinhib = aceinhib + aceinhib`i'
}
mat list aceinhib
这就是我解决问题的方式,尽管可能有更干净的解决方案利用用户编写的包或其他我未在此处包含的基本 Stata 功能。