Для каждого наблюдения найти наиболее раннее значение за предшествующие 7 дней
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 85 86 87 88 89 90 91 92 | * (Вопрос) Некоторая переменная varX содержит значения даты и времени. Требуется создать другую переменную, которая бы содержала наиболее раннее значение переменной varX в 7-дневном периоде, предшествующем каждому отдельному значению переменной varX. * (Ответ) размещён в новостной группе. Автор: rlevesque@videotron.ca, 13.08.2001. * Посетите мой сайт по SPSS http://www.spsstools.ru. * Сгенерируем 100 случайных значений дата/время между 1 января 2001 и 31 марта 2001. NEW FILE. INPUT PROGRAM. LOOP #i = 1 TO 100. COMPUTE datetime = RV.UNIFORM(DATE.DMY(1,1,2001),DATE.DMY(31,3,2001)). END CASE. END LOOP. END FILE. END INPUT PROGRAM. EXECUTE. COMPUTE date1=XDATE.DATE(datetime). COMPUTE time1=XDATE.TIME(datetime). COMPUTE varx=date1 + time1. FORMATS varx datetime (DATETIMEW19) date1(ADATE10) time1(TIME5). VARIABLE WIDTH varx datetime(17) time1(6) date1(11). ** Цель кода выше - создать пример файла данных. В решение предполагается, что переменная varX включает как дату, так и время. Если это не так (дата и время разнесены по разным переменным), объедините их в одну переменную, как показано выше. SORT CASES BY varx. RANK varx /N into n. * N будет содержать число наблюдений в файле. * Запишем вспомогательный макрос, который будем вызывать из основного. DO IF $CASENUM=1. WRITE OUTFILE 'c:\\temp\\temp.sps' /"DEFINE !n()"n"!ENDDEFINE.". END IF. EXE. INCLUDE FILE="c:\\temp\\temp.sps". /* Число наблюдений в файле теперь можно получить, подставив !n */. * Следующая установка - просто чтобы показать пользователю, что происходит (какой синтаксис генерируется и исполняется). Если это не нужно, просто замените здесь yes на no. SET MPRINT=yes. *///////////////////////////////. DEFINE !findmin(myvar=!TOKENS(1)) STRING vnames(A8). COMPUTE vnames=CONCAT('v',LTRIM(STRING($CASENUM,F7.0))). FLIP VARIABLES=varx /NEWNAME=vnames . VECTOR r(!n F8.0) /v=v1 TO !CONCAT('v',!n). * Следующая переменная содержит число секунд в 7 днях. COMPUTE #seven = 7*24*60*60. * Следующий цикл вычисляет для нас ответ. LOOP #1=1 TO !EVAL(!n). + LOOP #2=#1 TO 1 BY (-1) IF v(#1)- #seven <= v(#2). + COMPUTE r(#1)=v(#2). + END LOOP. END LOOP. SAVE OUTFILE='c:\\temp\\all vars.sav'. * Цель остальной части программы - просто расположить значения varX и newvar в соседних колонках. MATCH FILES FILE=* /KEEP=v1 TO !CONCAT('v',!n). FLIP. RENAME VARIABLES (var001 = varx). SAVE OUTFILE='c:\\temp\\varx.sav'. GET FILE='c:\\temp\\all vars.sav'. MATCH FILES FILE=* /KEEP=r1 TO !CONCAT('r',!n). FLIP. RENAME VARIABLES (var001 = newvar). MATCH FILES /FILE=* /FILE='C:\\Temp\\varx.sav' /RENAME (case_lbl = d0) /DROP= d0. MATCH FILES FILE=* /KEEP=varx newvar. FORMATS varx newvar (DATETIMEW19). VARIABLE WIDTH varx newvar(17). EXECUTE. !ENDDEFINE. ** Вызовем макрос, который выполнит задачу. !findmin myvar=varx. |