Stata Loop 用于对三个单独的 dta 文件执行一系列操作

Stata Loop for a series of actions on three separate dta files

我正在尝试在 Stata 中创建一个循环以将一系列操作(包括合并、替换缺失值、替换日期变量、排序和保存)应用于 3 个不同的 dta 文件(menin.dta、Bmenin.dta 和非 Bmenin.dta)。下面我已经复制了如何在没有循环的情况下完成这些任务,但是为了简化它,我想弄清楚如何循环这段代码。

use "C:\Users\Desktop\menin.dta",clear
merge 1:1 bene_id using Controls,nogenerate
replace menin= 0 if menin ==.
replace date= refdate if menin ==0 
sort bene_id
save "C:\Users\Desktop\menin2.dta",replace

use "C:\Users\Desktop\Bmenin.dta",clear
merge 1:1 bene_id using Controls,nogenerate
replace Bmenin= 0 if Bmenin ==.
replace date= refdate if Bmenin ==0 
sort bene_id
save "C:\Users\Desktop\Bmenin2.dta",replace

use "C:\Users\Desktop\nonBmenin.dta",clear
merge 1:1 bene_id using Controls,nogenerate
replace nonBmenin= 0 if nonBmenin ==.
replace date= refdate if nonBmenin ==0 
sort bene_id
save "C:\Users\Desktop\nonBmenin2.dta", replace

这应该满足您的要求:

foreach data_name in menin Bmenin nonBmenin {
    use "C:\Users\Desktop\`data_name'.dta", clear
    merge 1:1 bene_id using Controls, nogenerate
    replace `data_name'= 0 if `data_name' == .
    replace date = refdate if `data_name' == 0 
    sort bene_id
    save "C:\Users\Desktop/`data_name'2.dta", replace
}

请注意,如果紧跟在 \ 之后,` 会被转义,因此您需要执行 \`/`。我在上面的代码示例中分别使用了其中一个。最佳做法是仅使用 /,因为这会使此代码在 Linux 和 Mac 计算机上也成为 运行,但是您必须更新硬编码文件路径无论如何。