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 |
| Date |
June 2000; modified April 2005 |
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 |
+---+
|