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
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
* Реорганизация данных об одновременных активностях испытуемых.

* (Вопрос). Мы наблюдаем за испытуемыми и записываем их действия в течение дня. Фиксируется
* время начала некоторой активности испытуемого, время окончания этой активности, тип (код) этой
* активности, а также - набор переменных, характеризующих прочие наблюдаемые параметры.
* Собранные данные имеют такой вид:

№  начало        конец        ТипАкт            var 1   var2... ...varn    День наблюд.
1 8:00:00       8:00:20        70              100     200     ....450       1
2 8:00:10       8:00:40        85              103     205     ...460        1
...
x 16:00:00      16:03:30       70              100     0       ...450        z

Как видно, некоторые действия наблюдаемые могут выполнять одновременно (в "многозадачном" режиме), то есть, временные
интервалы могут перекрываться, по крайней мере, частично. Кроме того, каждая активность может иметь свою длительность.

Теперь хотелось бы преобразовать данные в матрицу "время/активность" следующим образом.
Каждая строка должна относиться к одному моменту времени (моменты отдалены друг от друга на 5 секунд - определяется
точностью фиксацией времени). Если в этот момент времени происходит более 1 активности (например, 2 или, в общем случае, y активностей), 
данные, относящиеся ко 2-й и последующим активностям следует расположить справа от данных, характеризующих первую активность. Например,
в переменных, именованных как AT 2, var 2-1, var 2-2 to var 2-n  (или ATy, var y-1, var y-2, var y-n для активности y).
(Число активностей в один момент времени не может превосходить 4 (никто не может делать более 4 дел одновременно ;-), так что y<=4).

Таким образом, результат преобразования должен выглядеть так.

№  время        ТипАкт           var 1   var2.   ...varn    AT2        var2-1   var2-2  var2-n
1 8:00:00         70             100     200        450      0           0       0       ...0
2 8:00:05         70             100     200        450      0           0       0       ...0
3 8:00:10         70             100     200        450     85           103     205     ...460
4 8:00:15         70             100     200        450     85           103     205     ...460
5 8:00:20         85             103     205        460      0           0       0       ...0
6 8:00:25         85             103     205        460      0           0       0       ...0
7 8:00:30         85             103     205        460      0           0       0       ...0
8 8:00:30         85             103     205        460      0           0       0       ...0
...
x16:03:25         70             100     0          450      0           0       0       ...0


*(Ответ) Автор: Ray. Размещён в SPSSX-L 21.07.2002.

DATA LIST LIST /Nr(F8) stime etime(2TIME8) atype var1 var2 var3 var4 day(6F8.0).
BEGIN DATA.
1 8:00:00  8:00:20 70    100     200   250 450  1
2 8:00:10  8:00:40 85    103     205   230 460  1
3 8:00:15  8:00:45 90    110     200   200 400  1
4 16:00:00 	16:03:30 70  100     0     200 450  10
5 16:01:25 	16:02:05 75  100     0     200 450  10
END DATA.
LIST.

COMPUTE #s=stime. 

* Далее предполагается, что максимальная продолжительность активности составляет 24 часа,
* т.е. 24*60*60/5=17280.
LOOP cnt=1 TO 17280.
COMPUTE stime=#s.
XSAVE OUTFILE='c:\\temp\\data1.sav' KEEP=stime atype var1 TO var4 .
COMPUTE #s=#s + 5.
END LOOP IF stime>=etime.
EXECUTE.
GET FILE='c:\\temp\\data1.sav'.

SORT CASES BY stime atype.
COMPUTE casen=$CASENUM.

RANK VARIABLES=casen BY stime /RANK INTO idx.
VECTOR at(4F8) /var1_(4F8) /var2_(4F8) /var3_(4F8) /var4_(4F8).


COMPUTE at(idx)=atype.


DO IF idx=1. 
+	COMPUTE var1_1=var1.
+	COMPUTE var1_2=var2.
+	COMPUTE var1_3=var3.
+	COMPUTE var1_4=var4.
ELSE IF idx=2.
+	COMPUTE var2_1=var1.
+	COMPUTE var2_2=var2.
+	COMPUTE var2_3=var3.
+	COMPUTE var2_4=var4.
ELSE IF idx=3.
+	COMPUTE var3_1=var1.
+	COMPUTE var3_2=var2.
+	COMPUTE var3_3=var3.
+	COMPUTE var3_4=var4.
ELSE IF idx=4.
+	COMPUTE var4_1=var1.
+	COMPUTE var4_2=var2.
+	COMPUTE var4_3=var3.
+	COMPUTE var4_4=var4.
END IF.

AGGREGATE
  /OUTFILE=*
  /BREAK=stime
  /at1 TO at4 = FIRST(at1 TO at4) 
  /var1_1 TO var1_4  = FIRST(var1_1 TO var1_4)
  /var2_1 TO var2_4  = FIRST(var2_1 TO var2_4)
  /var3_1 TO var3_4  = FIRST(var3_1 TO var3_4)
  /var4_1 TO var4_4  = FIRST(var4_1 TO var4_4).

COMPUTE nr=$CASENUM.
ADD FILES FILE=* /KEEP=nr stime 
	at1 var1_1 TO var1_4 
	at2 var2_1 TO var2_4 
	at1 var3_1 TO var3_4 
	at1 var4_1 TO var4_4.