* (Вопрос) Некоторая переменная 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.