У меня работает следующее:
generate obs = _n
bysort id (year): generate tag = (paint == 2) // CHANGE THIS NUMBER
bysort id (year): list if sum(tag) <= 1 & sum(tag[_n-1]) == 0
Это покажет все наблюдения, когда значение переменной paint
равно 2
:
---------------------------------------------------------------------------------------------
-> id = 1000789
+------------------------------------+
| id year paint obs tag |
|------------------------------------|
1. | 1000789 2012 1 1 0 |
2. | 1000789 2013 1 2 0 |
3. | 1000789 2014 2 3 1 |
+------------------------------------+
---------------------------------------------------------------------------------------------
-> id = 1000790
+------------------------------------+
| id year paint obs tag |
|------------------------------------|
1. | 1000790 2012 1 7 0 |
2. | 1000790 2013 1 8 0 |
3. | 1000790 2014 2 9 1 |
+------------------------------------+
---------------------------------------------------------------------------------------------
-> id = 1000791
+------------------------------------+
| id year paint obs tag |
|------------------------------------|
1. | 1000791 2012 1 14 0 |
2. | 1000791 2013 2 15 1 |
+------------------------------------+
Чтобы сохранить каждый их набор в локальном макросе, вы можете сделать следующее:
forvalues i = 1 / 3 {
preserve
generate obs = _n
bysort id (year): generate tag = (paint == `i')
bysort id (year): keep if sum(tag) <= 1 & sum(tag[_n-1]) == 0
quietly levelsof obs, local(obs`i')
restore
}
. display "`obs1'"
1 7 14
. display "`obs2'"
1 2 3 7 8 9 14 15
. display "`obs3'"
1 2 3 4 5 7 8 9 10 14 15 16 17 18