Home  /  Resources & support  /  FAQs  /  if command versus if qualifier

I have an if or while command in my program that only seems to evaluate the first observation. What’s going on?

Title   if command versus if qualifier
Author Jeremy B. Wernow, StataCorp

A common mistake is to use the if command as the argument. This is incorrect Stata syntax. The if command was designed to be used with a single expression (often a local macro) inside programs and do-files. Using this command incorrectly results in the evaluation of the expression using only the first observation of the variable. The same behavior applies for the while command.

 . list

      +---+
      | x |
      |---|
   1. | 1 |
   2. | 1 |
   3. | 2 |
   4. | 3 |
   5. | 2 |
      |---|
   6. | 3 |
   7. | 1 |
   8. | 2 |
   9. | 1 |
  10. | 3 |
      +---+

 if x == 3 {
 replace x = 4
 }

 . list

      +---+
      | x |
      |---|
   1. | 1 |
   2. | 1 |
   3. | 2 |
   4. | 3 |
   5. | 2 |
      |---|
   6. | 3 |
   7. | 1 |
   8. | 2 |
   9. | 1 |
  10. | 3 |
      +---+

At first glance, one would wonder why this did not work. From a logical viewpoint, there is nothing wrong with the command. As mentioned above, Stata was designed to evaluate only a single expression for the if command, so it is evaluated only for the first observation, x = 1.

  if x == 1 {
   replace x = 4
  }

  (10 real changes made)

 . list

      +---+
      | x |
      |---|
   1. | 4 |
   2. | 4 |
   3. | 4 |
   4. | 4 |
   5. | 4 |
      |---|
   6. | 4 |
   7. | 4 |
   8. | 4 |
   9. | 4 |
  10. | 4 |
      +---+

This is obviously not what the user intended. The solution to this problem is often to rewrite the command using if as a qualifier rather than as a command. As a qualifier, if will evaluate each observation as the command passes over the data.

 . replace x = 4 if x == 3
 . replace x = 4 if x == 1

As noted earlier, the same behavior will be seen when using the while command.

 . list

      +---+
      | x |
      |---|
   1. | 1 |
   2. | 1 |
   3. | 2 |
   4. | 3 |
   5. | 2 |
      |---|
   6. | 3 |
   7. | 1 |
   8. | 2 |
   9. | 1 |
  10. | 3 |
      +---+

 while x == 3 {
  replace x = 4
 }
 
 . list

      +---+
      | x |
      |---|
   1. | 1 |
   2. | 1 |
   3. | 2 |
   4. | 3 |
   5. | 2 |
      |---|
   6. | 3 |
   7. | 1 |
   8. | 2 |
   9. | 1 |
  10. | 3 |
      +---+

 while x == 1 {
  replace x = 4
 }
 (10 real changes made)

 . list

      +---+
      | x |
      |---|
   1. | 4 |
   2. | 4 |
   3. | 4 |
   4. | 4 |
   5. | 4 |
      |---|
   6. | 4 |
   7. | 4 |
   8. | 4 |
   9. | 4 |
  10. | 4 |
      +---+