Определите первое событие или последнее не событие
У меня есть следующие данные в Stata:
clear
* Input data
input float id str7 event time
id event time
1 "." 10
1 "." 20
1 "1" 30
1 "0" 40
1 "." 50
2 "0" 10
2 "0" 20
2 "0" 30
2 "0" 40
2 "0" 50
3 "1" 10
3 "1" 20
3 "0" 30
3 "." 40
3 "." 50
4 "." 10
4 "." 20
4 "." 30
4 "." 40
4 "." 50
5 "1" 10
5 "1" 20
5 "1" 30
5 "1" 40
5 "1" 50
end
Ниже приведены данные, которые я надеюсь получить:
* Input data
input float id str7 event time
id1 event1 time1
1 1 30
2 0 50
3 1 10
4 . 50
5 1 10
end
Моя цель - взять первый ряд для каждого id
события, равного 1
, Если id
не имеет события в течение какого-либо времени, то я хочу сообщить в последний раз отчета.
3 ответа
Решение
Следующие работы для меня:
replace event = "-1" if event == "1"
bysort id (event time): generate tag1 = event[_n==1] == "-1"
bysort id (event time): generate tag2 = event[_n==_N] == "0"
bysort id (event time): generate tag3 = event[_n==_N] == "."
replace event = "1" if event == "-1"
keep if tag1 == 1 | tag2 == 1 | tag3 == 1
list
+----------------------------------------+
| id event time tag1 tag2 tag3 |
|----------------------------------------|
1. | 1 1 30 1 0 0 |
2. | 2 0 50 0 1 0 |
3. | 3 1 10 1 0 0 |
4. | 4 . 50 0 0 1 |
5. | 5 1 10 1 0 0 |
+----------------------------------------+
Вот еще один способ сделать это:
bysort id (time): egen when_first_1 = min(cond(event == "1", time, .))
by id: gen tokeep = cond(when_first_1 == ., time == time[_N], time == when_first_1)
keep if tokeep
drop tokeep
Смотрите особенно Раздел 9 в этой статье.
Это основано на ответе Ромальпы Акзо на Statalist:
bys id (time): gen tag = 1 if event == "1" | _n ==_N
bys id (tag time): keep if _n == 1
drop tag
Я думаю, что это самый лучший ответ на сегодняшний день. Обратите внимание, как это зависит от tag
отсутствует, если это не так 1
,