Нестандартное слияние файлов
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 | Имеются 2 файла SPSS (T1.sav и T2.sav) такого вида: Наблюдения в T1: ID V11 --- -- 123 11 123 12 Наблюдения в T2: ID V21 --- -- 123 21 123 22 123 23 Требуется сгенерировать файл T3, полученный путём слияния T1 и T2. Он должен иметь такую структуру: Наблюдения в T3: ID V11 V21 --- -- -- 123 11 21 123 11 22 123 11 23 123 12 21 123 12 22 123 12 23 *** Автор решения: Raynald Levesque. Размещено 04.05.2001 в SPSSX-L. *Решение предполагает, что интересующие нас переменные числовые. * (Не составит большого труда адаптировать его под строковые при необходимости). *Решение достаточно общее в том смысле, что работает с любым числом значений * переменных id, v11 и v12. *Однако же для этого примера я задал максимум в 50 различных значений. * Так что при необходимости вы просто заменяете 50 на любое большее подходящее число. * Возможно, конечно, полностью автоматизировать решение и заставить его подсчитать * число разных значений самостоятельно, но я не стал усложнять. DATA LIST LIST /id v11. BEGIN DATA 123 11 123 12 124 15 124 16 124 18 124 19 END DATA. LIST. SAVE OUTFILE='c:\\temp\\t1.sav'. DATA LIST LIST /id v21. BEGIN DATA 123 21 123 22 123 23 124 26 124 27 END DATA. LIST. SAVE OUTFILE='c:\\temp\\t2.sav'. *Переформатируем первый файл. GET FILE='c:\\temp\\t1.sav'. COMPUTE caseid=$CASENUM. RANK VARIABLES=caseid (A) BY id /RANK INTO idx. VECTOR v11_(50F8.0). COMPUTE v11_(idx)=v11. AGGREGATE /OUTFILE=* /BREAK=id /v11_1 TO v11_50 = MAX(v11_1 TO v11_50). SAVE OUTFILE='c:\\temp\\t11.sav'. *Переформатируем второй файл. GET FILE='c:\\temp\\t2.sav'. COMPUTE caseid=$CASENUM. RANK VARIABLES=caseid (A) BY id /RANK INTO idx. VECTOR v21_(50F8.0). COMPUTE v21_(idx)=v21. AGGREGATE /OUTFILE=* /BREAK=id /v21_1 TO v21_50 = MAX(v21_1 TO v21_50). * Сливаем оба файла. MATCH FILES /FILE=* /FILE='C:\\Temp\\t11.sav' /BY id. * Отформатируем результат. VECTOR v21_=v21_1 TO v21_50 /v11_=v11_1 TO v11_50. LOOP cnt1=1 TO 50. COMPUTE v11=v11_(cnt1). LOOP cnt2=1 TO 50. COMPUTE v21=v21_(cnt2). XSAVE OUTFILE='c:\\temp\\targetfile.sav' /KEEP=id v11 v21. END LOOP IF MISSING(v21). END LOOP IF MISSING(v11). EXECUTE. GET FILE='c:\\temp\\targetfile.sav'. SELECT IF ~MISSING(v11)&~MISSING(v21). EXECUTE. |