Amin Karimi
Amin Karimi

Reputation: 407

How to repeat observation in a variety range?

I want to repeat drop variable for next date in each name.

Consider the following data frame:

* Example generated by -dataex-. To install: ssc install dataex
clear
input str4 name long date str8 time float drop
"A" 17659 "11:32:41" 1
"A" 17659 "12:32:41" 1
"A" 17659 "13:32:41" 1
"A" 17660 "11:32:41" .
"A" 17660 "12:32:41" .
"A" 17660 "13:32:41" .
"A" 17660 "14:32:41" .
"B" 17659 "11:32:41" .
"B" 17659 "12:32:41" .
"B" 17659 "13:32:41" .
"B" 17659 "14:32:41" .
"B" 17660 "11:32:41" 1
"B" 17660 "12:32:41" 1
"B" 17661 "11:32:41" 1
"B" 17661 "12:32:41" 1
"C" 17659 "11:32:41" 1
"C" 17659 "12:32:41" 1
"C" 17660 "11:32:41" .
"C" 17660 "12:32:41" .
"C" 17660 "13:32:41" .
"C" 17661 "11:32:41" .
"C" 17661 "12:32:41" .
"C" 17661 "13:32:41" .
"C" 17661 "14:32:41" .
end
format %d date

So the result is:

+------+-----------+----------+-------+
| name |   date    |   time   | drop  |
+------+-----------+----------+-------+
| A    | 07may2008 | 11:32:41 |     1 |
| A    | 07may2008 | 12:32:41 |     1 |
| A    | 07may2008 | 13:32:41 |     1 |
| A    | 08may2008 | 11:32:41 |     1 |
| A    | 08may2008 | 12:32:41 |     1 |
| A    | 08may2008 | 13:32:41 |     1 |
| A    | 08may2008 | 14:32:41 |     1 |
| B    | 07may2008 | 11:32:41 |       |
| B    | 07may2008 | 12:32:41 |       |
| B    | 07may2008 | 13:32:41 |       |
| B    | 07may2008 | 14:32:41 |       |
| B    | 08may2008 | 11:32:41 |     1 |
| B    | 08may2008 | 12:32:41 |     1 |
| B    | 09may2008 | 11:32:41 |     1 |
| B    | 09may2008 | 12:32:41 |     1 |
| C    | 07may2008 | 11:32:41 |     1 |
| C    | 07may2008 | 12:32:41 |     1 |
| C    | 08may2008 | 11:32:41 |     1 |
| C    | 08may2008 | 12:32:41 |     1 |
| C    | 08may2008 | 13:32:41 |     1 |
| C    | 09may2008 | 11:32:41 |       |
| C    | 09may2008 | 12:32:41 |       |
| C    | 09may2008 | 13:32:41 |       |
| C    | 09may2008 | 14:32:41 |       |
+------+-----------+----------+-------+

Finaly if we use drop if drop == 1 the result is:

+------+-----------+----------+-------+
| name |   date    |   time   | drop  |
+------+-----------+----------+-------+
| B    | 07may2008 | 11:32:41 |       |
| B    | 07may2008 | 12:32:41 |       |
| B    | 07may2008 | 13:32:41 |       |
| B    | 07may2008 | 14:32:41 |       |
| C    | 09may2008 | 11:32:41 |       |
| C    | 09may2008 | 12:32:41 |       |
| C    | 09may2008 | 13:32:41 |       |
| C    | 09may2008 | 14:32:41 |       |
+------+-----------+----------+-------+

Upvotes: 1

Views: 80

Answers (1)

Amin Karimi
Amin Karimi

Reputation: 407

gen a=0
replace a=1 if(drop[_n]==1 & drop[_n+1]==. & name[_n]==name[_n+1] & _n < _N)
replace a=1 if(drop[_n]==. & drop[_n-1]==1 & name[_n]==name[_n-1] & _n < _N)
bysort name date: egen b=max(a)
sort name date

drop if b==1
drop if drop ==1
drop drop a b

EDIT Nick Cox

gen a = drop==1 & drop[_n+1]==. & name==name[_n+1] & _n < _N
replace a=1 if drop==. & drop[_n-1]==1 & name==name[_n-1] & _n < _N
bysort name date (a): gen b = a[_N] 

drop if b==1 | drop ==1
drop drop a b

Upvotes: 2

Related Questions