Определить первое событие или последнее не событие - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующие данные в 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 ]

0 голосов
/ 07 ноября 2018

Вот еще один способ сделать это:

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 в этой статье .

0 голосов
/ 07 ноября 2018

Это основано на ответе Ромальпы Акзо на Statalist :

bys id (time): gen tag = 1 if  event == "1" | _n ==_N
bys id (tag time): keep if _n == 1
drop tag

Я думаю, что это самый лучший ответ на сегодняшний день. Обратите внимание, как это зависит от того, отсутствует ли tag, если это не 1.

0 голосов
/ 07 ноября 2018

У меня работает следующее:

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