#foreach #stata #stata-macros
#foreach #stata #stata-макросы
Вопрос:
Я хочу использовать foreach
для вырезания того же образца с использованием Stata.
Я написал следующий фрагмент кода:
foreach i of numlist 0/11 {
preserve
keep id projectno nickname
gen start=`i'*30000 1
gen end=(`i' 1)*30000
outsheet using d:profilenickname_`i'.xls in `start'/`end'
restore
}
Тем не менее, я получаю приведенную ниже ошибку, несмотря на то, что пересматривал ее много раз:
‘/’ неверный номер наблюдения
Как я могу исправить свой код?
Комментарии:
1. Если вы нашли мой ответ полезным, пожалуйста, рассмотрите возможность проголосовать за него с помощью стрелки вверху и принять его, установив флажок.
Ответ №1:
Это не полный ответ — и он фокусируется на побочной проблеме вашего вопроса — но он не будет легко вписываться в комментарий.
Вместе с изменениями, описанными в другом месте, я бы изменил порядок ваших команд на
preserve
keep id projectno nickname
forval i = 0/11 {
local start= `i' * 30000 1
local end = (`i' 1) * 30000
outsheet using d:profilenickname_`i'.xls in `start'/`end'
}
restore
Ответ №2:
in
Оператор в outsheet
команде неправильный, потому что start
и end
генерируются как переменные, а не локальные макросы. Вам необходимо инициализировать оба start
и end
следующим образом:
local start = `i' * 30000 1
local end = (`i' 1) * 30000
Рассмотрим следующий игрушечный пример с использованием auto
набора данных игрушек Stata:
sysuse auto, clear
foreach i of numlist 0/11 {
preserve
keep price mpg make
local start = (`i' * 3) 1
local end = (`i' 1) * 3
list in `start' / `end'
restore
}
Результаты:
---------------------------
| make price mpg |
|---------------------------|
1. | AMC Concord 4,099 22 |
2. | AMC Pacer 4,749 17 |
3. | AMC Spirit 3,799 22 |
---------------------------
-----------------------------
| make price mpg |
|-----------------------------|
4. | Buick Century 4,816 20 |
5. | Buick Electra 7,827 15 |
6. | Buick LeSabre 5,788 18 |
-----------------------------
------------------------------
| make price mpg |
|------------------------------|
7. | Buick Opel 4,453 26 |
8. | Buick Regal 5,189 20 |
9. | Buick Riviera 10,372 16 |
------------------------------
------------------------------
| make price mpg |
|------------------------------|
10. | Buick Skylark 4,082 19 |
11. | Cad. Deville 11,385 14 |
12. | Cad. Eldorado 14,500 14 |
------------------------------
-------------------------------
| make price mpg |
|-------------------------------|
13. | Cad. Seville 15,906 21 |
14. | Chev. Chevette 3,299 29 |
15. | Chev. Impala 5,705 16 |
-------------------------------
---------------------------------
| make price mpg |
|---------------------------------|
16. | Chev. Malibu 4,504 22 |
17. | Chev. Monte Carlo 5,104 22 |
18. | Chev. Monza 3,667 24 |
---------------------------------
------------------------------
| make price mpg |
|------------------------------|
19. | Chev. Nova 3,955 19 |
20. | Dodge Colt 3,984 30 |
21. | Dodge Diplomat 4,010 18 |
------------------------------
-------------------------------
| make price mpg |
|-------------------------------|
22. | Dodge Magnum 5,886 16 |
23. | Dodge St. Regis 6,342 17 |
24. | Ford Fiesta 4,389 28 |
-------------------------------
----------------------------------
| make price mpg |
|----------------------------------|
25. | Ford Mustang 4,187 21 |
26. | Linc. Continental 11,497 12 |
27. | Linc. Mark V 13,594 12 |
----------------------------------
---------------------------------
| make price mpg |
|---------------------------------|
28. | Linc. Versailles 13,466 14 |
29. | Merc. Bobcat 3,829 22 |
30. | Merc. Cougar 5,379 14 |
---------------------------------
-----------------------------
| make price mpg |
|-----------------------------|
31. | Merc. Marquis 6,165 15 |
32. | Merc. Monarch 4,516 18 |
33. | Merc. XR-7 6,303 14 |
-----------------------------
------------------------------
| make price mpg |
|------------------------------|
34. | Merc. Zephyr 3,291 20 |
35. | Olds 98 8,814 21 |
36. | Olds Cutl Supr 5,172 19 |
------------------------------
Обратите внимание, что необязательно, чтобы команды preserve
, keep
и restore
находились в вашем цикле, поскольку это одноразовые операции, и повторять их просто неэффективно.