循环遍历许多数据集以获得一个汇总表

时间:2016-06-24 17:03:41

标签: loops stata

我在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个表的综合结果。

3 个答案:

答案 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