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 | +---+