我在Stata中有大约100个数据集。我想循环遍历所有这些,以获得所有服用药物aceinhib的数据集中人员比例的汇总表。我可以编写为每个数据集生成表的代码,但我想要的是一个表中所有这些表的摘要。
以下是仅使用5个数据集的示例:
forval i=1/5 {
capture use "FILEADDRESS\FILENAME`i'", clear
table aceinhib
capture save "FILEADDRESS\NEW_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个表的综合结果。
答案 0 :(得分:1)
考虑这种模式:
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
只是累计从一个文件到另一个文件的计数。对于真正的问题,请不要重复读取相同的数据集,而是循环读取不同的文件。
答案 1 :(得分:0)
如果所有文件具有相同的结构,您可以在append
命令之前table
将它们放入一个文件中。以下解决方案还依赖aceinhib
编码为0/1。如果文件不是太大而无法附加,则可能很简单:
use "FILEADDRESS\FILENAME1", clear
forvalues i = 2/100 {
append using "FILEADDRESS\FILENAME`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\0)
forvalues i = 1/100 {
use "`FILENAME`i''", clear
tab aceinhib, matcell(aceinhib`i')
mat aceinhib = aceinhib + aceinhib`i'
}
mat list aceinhib
这就是我解决这个问题的方法,尽管可能有更清晰的解决方案利用用户编写的软件包或其他我没有包含的基本Stata功能。
答案 2 :(得分:0)
也许这会指出你有用的方向。
clear
tempfile working
save `working', emptyok
forval i=1/5{
quietly use "FILEADDRESS\FILENAME`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