Преобразование данных из «узкого» вида в «широкий» при наличии текстовых значений
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 | * Преобразование данных из "узкого" вида в "широкий" при наличии текстовых значений. * Автор кода: Raynald Levesque. DATA LIST fixed records = 1/1 seg 1-2 (f) state 3-4 (f) ori 5-13 (a) inum 14-25 (a) idate 26-33 (f) offcode 34-36 (a) a_c 37 (a) susp1 38 (a) susp2 39 (a) susp3 40 (a) loc 41-42 (f) enter 43-44 (f) method 45 (a) tyact1 46 (a) tyact2 47 (a) tyact3 48 (a) weap1 49-51 (a) weap2 53-54 (a) weap3 55-57 (a) bias 58-59 (f). BEGIN DATA. 0133ori_ori__inum_inum___10311999of1astu1234mtuvwea wewea22 0133ori_ori__inum_inum___11311999of2bstu1234mtuvwea wewea22 0133ori_ori__inum_inum___12151999of3cstu1234mtuvwea wewea22 0133ori_ori__inum_inum___12291999of4dstu1234mtuvwea wewea22 0133ori2ori__inum_inum___10311999of5estu1234mtuvwea wewea22 0133ori2ori__inum_inum___11011999of6fstu1234mtuvwea wewea22 END DATA. LIST. *Сформируем идентификатор уникальных записей. * (записи с одинаковыми значениями переменных seg, state, ori, inum получают одинаковый идентификатор). STRING id(A23). COMPUTE id=CONCAT(STRING(seg,F2),STRING(state,F2),ori,inum). SORT CASES BY id. * Пронумеруем уникальные записи. DO IF $casenum=1. COMPUTE recno=1. ELSE. COMPUTE recno=(lag(id)=id)*lag(recno)+1. END IF. * Следующая строка подразумевает, что вам нужно, скажем, объединить "вширь" информацию максимум о 3 записях с одинаковым id. SELECT IF (recno<4). * Единственная причина создания числовых переменных ниже - возможность вставки их одна к одной и, как следствие, возможность адресации их через ключевое слово TO в команде AGGREGATE впоследствии (т.е. в принципе, числовые переменные заранее можно не объявлять). * добавьте сюда нужные переменные, которые также нужно сохранить. NUMERIC idate1 TO idate3. STRING offcode1 TO offcode3(A3) a_c1 TO a_c3(A1). DO IF recno=1. COMPUTE idate_1=idate. COMPUTE offcode1=offcode. COMPUTE a_c1=a_c. * добавьте сюда нужные переменные, которые также нужно сохранить. ELSE IF recno=2. COMPUTE idate_2=idate. COMPUTE offcode2=offcode. COMPUTE a_c2=a_c. * добавьте сюда нужные переменные, которые также нужно сохранить. ELSE. COMPUTE idate_3=idate. COMPUTE offcode3=offcode. COMPUTE a_c3=a_c. * you have to add the missing variables. END IF. * добавьте сюда нужные переменные, которые также нужно сохранить в конец команды AGGREGATE. AGGREGATE /OUTFILE=* /BREAK=id / idate_1 TO idate_3=MAX(idate_1 TO idate_3) /offcode1 TO offcode3=MAX(offcode1 TO offcode3) /a_c1 TO a_c3=MAX(a_c1 TO a_c3). |