* "Сжать" данные, объединив непрерывные отрезки времени.
** ВОПРОС .
Имеется массив данных такого вида:
id time1 time2
1 100 200
1 200 300
1 300 400
1 500 600
1 600 700
1 800 830
2 800 900
2 900 930
Требуется исключить лишние наблюдения, объединив те из них, которые образуют
в пределах одного ID непрерывные интервалы времени по переменным time1 и time2.
Например, для ID=1 первый отрезок времени между time1 и time2 составляет 100-200.
В следующем наблюдении этот отрезок непрерывно продолжается для того же ID=1 (200-300).
И в следующем. Затем наступает разрыв (предыдущий отрезок заканчивается значением 400,
а следующий начинается значением 500).
Я не знаю, сколько наблюдений могут образовывать непрерывный отрезок времени. Иногда - 1, иногда - несколько.
В конце концов требуется преобразовать данные к такому виду:
Желаемый результат.
id time1 time2
1 100 400
1 500 700
1 800 830
2 800 930
* ОТВЕТ. Автор: rlevesque@videotron.ca.
DATA LIST LIST /id time1 time2.
BEGIN DATA
1 100 200
1 200 300
1 300 400
1 500 600
1 600 700
1 800 830
2 800 900
2 900 930
END DATA.
LIST.
* предположим, что файл уже отсортирован должным образом.
MATCH FILES FILE=* /BY id /FIRST=first /LAST=last.
CREATE time1a= LEAD(time1,1).
CREATE time2a= LAG(time2,1).
* identify the beginning of a period.
DO IF first.
COMPUTE beg1=1.
ELSE.
COMPUTE beg1=time1<>time2a.
END IF.
* Определим концы непрерывных отрезков времени.
DO IF last.
COMPUTE end1=1.
ELSE.
COMPUTE end1=time2<>time1a.
END IF.
* Запомним значения времени, которыми заканчиваются непрерывные отрезки.
DO IF end1.
COMPUTE val2=time2.
END IF.
* Скопируем концевые значения во все пустые ячейки val2 непрерывного отрезка времени.
COMPUTE casenb=$CASENUM.
SORT CASES BY casenb(D).
IF MISSING(val2) val2=LAG(val2).
SORT CASES BY casenb.
* Оставим теперь только нужные строки.
SELECT IF beg1=1.
MATCH FILES FILE=* /KEEP=id time1 val2.
RENAME VARIABLES (val2=time2).
FORMATS id time1 time2 (F8.0).
EXECUTE.