*Слияние двух файлов по вхождению дат.SPS * ВОПРОС. Мне требуется слить два файла по определённому ключу. Этот ключ (patient_id - код пациента) в файле 1 может встречаться несколько раз (неуникален). Мне требуется слить по этому ключу первый файл и файл 2. Но в файле 2 ключ patient_id также неуникален. Однако, есть вспомогательный ключ, admission_id - код поступления при госпитализации, который является уникальным. Так, пациент 1 может быть госпитализирован более одного раза (каждый раз с разным admission_id), но при этом код пациента (patient_id) остаётся тем же. Таким образом, сопоставить эти два файла проблематично. Однако, имеется дополнительная информация, в частности - информация о датах. В файле 1: имеется дата взятия анализов. В файле 2: имеются даты поступления пациента (дата A) и выписки пациента (дата B). Мы знаем, что дата взятия анализов должна находиться между датами A и B. Вопрос: как определить условия слияния? * ОТВЕТ размещён в новостной группе SPSS, автор: Raynald Levesque, 02.07.2004.. В следущем примере последняя запись в file1 и третья запись в файле file2 не имеют соответствий. SET MPRINT=no. DATA LIST LIST /id dtTest otherVar. BEGIN DATA 1 20030115 2 1 20040215 5 2 20030705 7 2 20031022 5 2 20030101 9 END DATA. * Отсортируем и пронумеруем записи в пределах каждого id. SORT CASES BY id dtTest. COMPUTE idx=SUM(LAG(idx)*(LAG(id)=id),1). SAVE OUTFILE='c:\\temp\\file1.sav'. DATA LIST LIST /id admin_id dtIn dtOut. BEGIN DATA 1 10 20030101 20030201 1 15 20040115 20040315 1 17 20031010 20031210 2 22 20030701 20030710 2 32 20031001 20031030 END DATA. SAVE OUTFILE='c:\\temp\\file2.sav'. * Получим все даты анализов для каждого пациента (id). GET FILE='c:\\temp\\file1.sav'. VECTOR dt(3). COMPUTE dt(idx)=dtTest. AGGREGATE OUTFILE=* /PRESORTED /BREAK=id /dt1 TO dt3=FIRST(dt1 TO dt3). MATCH FILES FILE='c:\\temp\\file2.sav' /TABLE=* /BY=id. VECTOR dt=dt1 TO dt3. LOOP #idx=1 TO 3. DO IF RANGE(dt(#idx),dtIn,dtOut). - COMPUTE idx=#idx. - BREAK. END IF. END LOOP. * Уберём ненужные переменные. ADD FILES FILE=* /DROP=dt1 TO dt3. SORT CASES BY id idx. MATCH FILES FILE=* /FILE='c:\\temp\\file1.sav' /BY=id idx. LIST. *Результат:. id admin_id dtIn dtOut idx dtTest otherVar 1.00 17.00 20031010 20031210 . . . 1.00 10.00 20030101 20030201 1.00 20030115 2.00 1.00 15.00 20040115 20040315 2.00 20040215 5.00 2.00 . . . 1.00 20030101 9.00 2.00 22.00 20030701 20030710 2.00 20030705 7.00 2.00 32.00 20031001 20031030 3.00 20031022 5.00