Ошибка при использовании foreach для вырезания выборки

#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 находились в вашем цикле, поскольку это одноразовые операции, и повторять их просто неэффективно.