遍历多个数据集以获取一个汇总表



我在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 功能。

最新更新