這個答案是強調我的意見是,OP的循環是完全可以避免的。
(如果它在某種程度上需要一次又一次地看到文字treated unit
,然後generate text = "treated unit"
並將其包含在list
)
sysuse auto, clear
set seed 1234
gen random = uniform()
gen treat = 0
replace treat = 1 if random > 0.7
sum treat if treat == 1
local n = r(N)
bysort treat: gen counter = _n if treat == 1
sort counter
* OP's method
foreach i of numlist 1/`n'{
local w = weight[`i']
local ma = make[`i']
display `"treated unit `i' - `w' `ma' "'
}
treated unit 1 - 3670 Buick LeSabre
treated unit 2 - 4330 Cad. Deville
treated unit 3 - 3400 Buick Skylark
treated unit 4 - 3180 Chev. Malibu
treated unit 5 - 2930 AMC Concord
treated unit 6 - 2690 Pont. Sunbird
treated unit 7 -Pont. Grand Prix
treated unit 8 - 2200 Plym. Horizon
treated unit 9 - 2070 Audi Fox
treated unit 10 - 2640 AMC Spirit
treated unit 11 - 3720 Merc. Marquis
treated unit 12 - 2110 Chev. Chevette
treated unit 13 - 3690 Olds Delta 88
treated unit 14 - 3600 Dodge Magnum
treated unit 15 - 4060 Merc. Cougar
treated unit 16 - 3420 Pont. Phoenix
treated unit 17 - 3260 Plym. Arrow
treated unit 18 - 2130 Fiat Strada
treated unit 19 - 3200 Pont. Le Mans
treated unit 20 - 2410 Toyota Celica
treated unit 21 - 2670 Toyota Corona
treated unit 22 - 2230 Buick Opel
treated unit 23 - 3250 Buick Century
treated unit 24 - 1800 Plym. Champ
treated unit 25 - 2730 Olds Starfire
treated unit 26 - 3280 Buick Regal
treated unit 27 - 1800 Ford Fiesta
treated unit 28 - 1830 Renault Le Car
* alternative
list weight make if treat
+---------------------------+
| weight make |
|---------------------------|
1. | 3,670 Buick LeSabre |
2. | 4,330 Cad. Deville |
3. | 3,400 Buick Skylark |
4. | 3,180 Chev. Malibu |
5. | 2,930 AMC Concord |
|---------------------------|
6. | 2,690 Pont. Sunbird |
7. | 3,210 Pont. Grand Prix |
8. | 2,200 Plym. Horizon |
9. | 2,070 Audi Fox |
10. | 2,640 AMC Spirit |
|---------------------------|
11. | 3,720 Merc. Marquis |
12. | 2,110 Chev. Chevette |
13. | 3,690 Olds Delta 88 |
14. | 3,600 Dodge Magnum |
15. | 4,060 Merc. Cougar |
|---------------------------|
16. | 3,420 Pont. Phoenix |
17. | 3,260 Plym. Arrow |
18. | 2,130 Fiat Strada |
19. | 3,200 Pont. Le Mans |
20. | 2,410 Toyota Celica |
|---------------------------|
21. | 2,670 Toyota Corona |
22. | 2,230 Buick Opel |
23. | 3,250 Buick Century |
24. | 1,800 Plym. Champ |
25. | 2,730 Olds Starfire |
|---------------------------|
26. | 3,280 Buick Regal |
27. | 1,800 Ford Fiesta |
28. | 1,830 Renault Le Car |
+---------------------------+
當然,我很高興地認爲,這個玩具問題對於OP的代理真正的問題,但我看不到任何暗示這種技術是好的編程。
我很少遇到我必須通過觀察循環的情況。我可以使用'by variable:egen'完成大部分繁瑣的工作。例如,您可以爲另一個變量的每個值獲取變量的平均值,總和,計數等。您也可以使用'mkmat'和'svmat'從變量創建矩陣,反之亦然,然後使用矩陣運算符。 – chan1142
我不明白你爲什麼認爲你需要一個循環,即使你編輯的問題。給定一個二進制變量'treat'以某種方式創建,你的代碼基本上等同於'list weight make if treat == 1'加上一些重複的文本。如果計數器很重要,你可以'生成',單獨添加到'list',但即使如此,本地宏和循環在這裏完全是可有可無的。我猜你對於需要循環的語言更熟悉,但在Stata中,它們通常不需要用於基本任務。 –
@Nick,我的實際使用比簡單列出一些值更復雜一點,但我想保持簡單。這就是爲什麼在我最初的例子中,我所說的只是「用宏做些事情」。爲了不從我的問題的核心中分心,我大大簡化了示例,以便我可以使用已發佈的自動數據集,不需要讀者安裝用戶編寫的命令,也不需要解釋30行以上代碼的邏輯循環,當那些東西實際上不是我的問題需要.. – Amberopolis