«Сжать» данные, объединив непрерывные отрезки времени
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | * "Сжать" данные, объединив непрерывные отрезки времени. ** ВОПРОС . Имеется массив данных такого вида: 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. |