Соедините две таблицы вместе на основе похожих, но не равных столбцов в SAS - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь соединить эти две таблицы вместе. Я хочу, чтобы столбцы были выровнены там, где столбец «пациент» в таблице «регистрация» совпадает со столбцом «пациент» в таблице «календарь». «Patient» и «PatientID» похожи, но не равны. Кроме того, столбец «dateassigned» в таблице «enroll» должен соответствовать столбцу «datetracked» в таблице «calendar». Так как это всего лишь фрагмент большого набора данных, столбцы должны быть выровнены вместе. Тем не менее, это может быть не так в большом наборе данных, поэтому я пытаюсь выделить, где столбцы из обеих таблиц не совпадают. Заранее спасибо.

Мой текущий рабочий код дает мне

ОШИБКА: переменный пациент был определен как символ и цифра c.

data enroll;
    input patient status :$12. dateassigned &:anydtdte.;
    format date yymmdd10.;
    datalines;

500-001   enrolled    01-jan-2019      
500-002   enrolled    15-jan-2019     
500-003   removed     23-Jan-2019     
500-004   enrolled    05-feb-2019     
500-005   enrolled    17-feb-2019     
587-001   enrolled    20-feb-2019
587-002   enrolled    25-feb-2019
587-003   enrolled    03-mar-2019
594-001   enrolled    04-feb-2018
594-002   enrolled    09-feb-2018
648-001   enrolled    15-mar-2019
648-002   enrolled    22-mar-2019
648-003   enrolled    27-mar-2019
648-004   enrolled    30-mar-2019
;

data calendar;
    input visitnumber patientID :$12. datetracked &:anydtdte.;
    format date yymmdd10.;
    datalines;

500 500-001-rdf   01-jan-2019      
500 500-002-fgh   15-jan-2019     
500 500-003-ehd   23-Jan-2019     
500 500-004-ern   05-feb-2019     
500 500-005-qmd   17-feb-2019     
587 587-001-wcs   20-feb-2019
587 587-002-qlc   25-feb-2019
587 587-003-qhr   03-mar-2019
594 594-001-qwn   04-feb-2018
594 594-002-agj   09-feb-2018
648 648-001-wuf   15-mar-2019
648 648-002-qbf   22-mar-2019
648 648-003-olr   27-mar-2019
648 648-004-wmf   30-mar-2019
;


proc sort data=enroll;
by patient dateassigned;
run;

data calendar;
length patient $8.;
set calendar;
patient=substr(patientID,1,7);
dateassigned=datetracked;
run;

proc sort data=calendar;
by patient dateassigned;
run;

data want;
merge enroll(in=a) calendar(in=b);
by patient dateassigned;
if a and b;
run;

1 Ответ

0 голосов
/ 22 апреля 2020

В какой таблице вы хотите выделить, не выравниваются ли линии? Я бы работал с оператором pro c sql, создавая внутреннее соединение.

Затем вы можете выделить в A. Регистрация или в B. Календарь, есть ли строки, для которых выравнивание не было найдено:

/* Inner join to have view on aligned lines */
    proc sql;
      create table aligned as
      select a.*,
             b.*
      from enroll a inner join calendar b on a.patient = substr(b.patientID,1,7) and 
      a.dateassigned = b.datetracked;
    quit;

/* A.Except statement to have view on non aligned lines  - Enroll table*/

    proc sql;
      create table non_aligned_enroll as
      select * from enroll
      except 
      select a.* from enroll a inner join calendar b on a.patient = 
      substr(b.patientID,1,7) and a.dateassigned = b.datetracked;
    quit;

/* B.Except statement to have view on non aligned lines  - Enroll table*/

    proc sql;
      create table non_aligned_calendar as
      select * from calendar
      except 
      select b.* from enroll a inner join calendar b on a.patient = 
      substr(b.patientID,1,7) and a.dateassigned = b.datetracked;
    quit;
...