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
* Заполнение пропусков значениями из строк с тем же ID.

*(Вопрос) 
Предположим, данные выглядят следующим образом.
Переменная PAR_ID - код родителя, переменная CH_ID - код ребенка.
Но переменная CH_ID, заканчивающаяся на 00, означает, что эта запись целиком о родителе.

PAR_ID      CH_ID       VAR1     VAR2 
X001        X00100     2          1
X001        X00102     .          .
X001        X00103     .          .
X002        X00200     1          .
X002        X00201     .          .
X003        X00300     3          2
X003        X00302     .          .
X003        X00303     .          .

Мне интересно, нет ли у кого скрипта, или модификации скрипта FillInTheGaps (см. выше в списке),
который бы приписал записям детей данные их родителей (в переменные VAR1 и VAR2), но не приписывал
бы детям данные чужих родителей. Например, детям X00102, X00103 следует в переменную VAR2 записать
значение 1 (от родителя X001), но для X00201 записывать это значение уже не надо, т.к. это ребенок
другого родителя, к которому предыдущие данные не имеют отношения.

Исправленный набор данных должен выглядеть следующим образом:

PAR_ID      CH_ID       VAR1     VAR2 

X001        X00100     2         1
X001        X00102     2         1
X001        X00103     2         1
X002        X00200     1         .
X002        X00201     1         .
X003        X00300     3         2
X003        X00302     3         2
X003        X00303     3         2



* (Ответ) Размещен в новостной группе 18.02.2002. Автор: Ray.

* Введем в SPSS пример данных, приведённый выше.
DATA LIST LIST /PAR_ID (A4)    CH_ID(A6)    VAR1      VAR2 (2F8.0).
BEGIN DATA
X001        X00100     2          1
X001        X00102     .          .
X001        X00103     .          .
X002        X00200     1          .
X002        X00201     .          .
X003        X00300     3          2
X003        X00302     .          .
X003        X00303     .          .
END DATA.
LIST.


SET ERRORS=no.
DO IF $CASENUM>1.
DO IF par_id = LAG(par_id).
DO REPEAT v=ch_id TO var2.
* Следующие 2 строчки предназначены для обработки переменных разных типов:
* строковых и числовых. Если переменная, для которой заменяются значения, 
* числовая, первая строка дает ошибку, но срабатывает вторая. Если переменная строковая,
* то наоборот. Вывод сообщений об ошибках временно отключен.
IF LEN(RTRIM(v))=0 v=LAG(v).
IF MISSING(v) v=LAG(v).
END REPEAT PRINT.
END IF.
END IF.
SET ERRORS=yes.
LIST.