Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Weird behavior of For Loop

    Hello, so I am trying to make a FOR loop work for a number of my variables, however it is showing odd behavior where it will not work for numbers 3 - 9 (without error) but is working fine for 1,2 and 10 onwards.
    I am not sure if there is some nomenclature issue with the numbers 3-9.
    Below is an example of its behavior, the code and the output with trace set to on.
    Thank you very much!


    scalar define y = 21
    foreach k of numlist 1/`=y' {
    if "`k'"<= "`=y'" {
    gen abc`k' = `k'
    }
    }
    foreach k of numlist 1/`=y' {
    2. if "`k'"<= "`=y'" {
    3. gen abc`k' = `k'
    4. }
    5. }
    - foreach k of numlist 1/`=y' {
    = foreach k of numlist 1/21 {
    - if "`k'"<= "`=y'" {
    = if "1"<= "21" {
    - gen abc`k' = `k'
    = gen abc1 = 1
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "2"<= "21" {
    - gen abc`k' = `k'
    = gen abc2 = 2
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "3"<= "21" {
    gen abc`k' = `k'
    }
    - }
    - if "`k'"<= "`=y'" {
    = if "4"<= "21" {
    gen abc`k' = `k'
    }
    - }
    - if "`k'"<= "`=y'" {
    = if "5"<= "21" {
    gen abc`k' = `k'
    }
    - }
    - if "`k'"<= "`=y'" {
    = if "6"<= "21" {
    gen abc`k' = `k'
    }
    - }
    - if "`k'"<= "`=y'" {
    = if "7"<= "21" {
    gen abc`k' = `k'
    }
    - }
    - if "`k'"<= "`=y'" {
    = if "8"<= "21" {
    gen abc`k' = `k'
    }
    - }
    - if "`k'"<= "`=y'" {
    = if "9"<= "21" {
    gen abc`k' = `k'
    }
    - }
    - if "`k'"<= "`=y'" {
    = if "10"<= "21" {
    - gen abc`k' = `k'
    = gen abc10 = 10
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "11"<= "21" {
    - gen abc`k' = `k'
    = gen abc11 = 11
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "12"<= "21" {
    - gen abc`k' = `k'
    = gen abc12 = 12
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "13"<= "21" {
    - gen abc`k' = `k'
    = gen abc13 = 13
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "14"<= "21" {
    - gen abc`k' = `k'
    = gen abc14 = 14
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "15"<= "21" {
    - gen abc`k' = `k'
    = gen abc15 = 15
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "16"<= "21" {
    - gen abc`k' = `k'
    = gen abc16 = 16
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "17"<= "21" {
    - gen abc`k' = `k'
    = gen abc17 = 17
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "18"<= "21" {
    - gen abc`k' = `k'
    = gen abc18 = 18
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "19"<= "21" {
    - gen abc`k' = `k'
    = gen abc19 = 19
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "20"<= "21" {
    - gen abc`k' = `k'
    = gen abc20 = 20
    - }
    - }
    - if "`k'"<= "`=y'" {
    = if "21"<= "21" {
    - gen abc`k' = `k'
    = gen abc21 = 21
    - }
    - }

  • #2
    Strings sort alphabetically, or as in a dictionary (sort on the first character, then on the second character if there is a tie for order; and so on); numbers sort numerically. The numbers 1 to 10 are quite enough to show the point. They sort as you would expect, but their string equivalents follow rules different enough to explain your puzzlement, as when the string "10" sorts before the strings "2" to "9".

    Being in a loop is immaterial to this.

    Code:
    . clear 
    
    . set obs 10 
    Number of observations (_N) was 0, now 10.
    
    . gen num = _n
    
    . sort num 
    
    . list 
    
         +-----+
         | num |
         |-----|
      1. |   1 |
      2. |   2 |
      3. |   3 |
      4. |   4 |
      5. |   5 |
         |-----|
      6. |   6 |
      7. |   7 |
      8. |   8 |
      9. |   9 |
     10. |  10 |
         +-----+
    
    . 
    . tostring num, replace 
    num was float now str2
    
    . sort num 
    
    . list 
    
         +-----+
         | num |
         |-----|
      1. |   1 |
      2. |  10 |
      3. |   2 |
      4. |   3 |
      5. |   4 |
         |-----|
      6. |   5 |
      7. |   6 |
      8. |   7 |
      9. |   8 |
     10. |   9 |
         +-----+

    Comment


    • #3
      Thank you very much Nick! I understood the issue, for now as a solution, I have used a big number (99) which includes those numbers as well, something I will need to be careful about in the future as well. Its working now and I am getting my desired results!

      Comment

      Working...
      X