SAS объединяет несколько столбцов с одинаковыми данными - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужна помощь с слиянием.У меня есть две таблицы, как показано ниже: Таблица 1

ID      ID1     ID2     ID3     ID4     ID5
1005    2005    3005    4005    5005    7105
3005    4005    5005    7105        
4005    5005    7105            
5005    7105                
2005    3005    4005    5005    7105    
7105                    

Таблица 2

ID      Names
1005    John
3005    Rick
4005    Sam
5005    Harry
2005    Mary
7105    Deena

Мне нужен эффективный способ объединения столбцов в таблице 1 с таблицей 2. Я могу объединить в отдельныешаги, но есть ли способ, которым я могу сделать это более эффективным способом?

proc sql;
create merge1 as 
select *
from table1 a
left join table2 b on a.id = b.id;
quit;

proc sql;
create merge2 as 
select *
from merge1 a
left join table2 b on a.id = b.id;
quit;

Результат, который я хочу со всеми столбцами (пример ниже):

ID    NamesID     ID1     NamesID1    ID2     NamesID2    ID3
1005    John     2005     Mary       3005     Rick       4005
3005    Rick     4005     Sam        5005     Harry      7105
4005    Sam      5005     Harry      7105     Deena 
5005    Harry    7105     Deena         
2005    Mary     3005     Rick       4005     Sam        5005
7105    Deena                                       

Спасибо!

1 Ответ

0 голосов
/ 05 февраля 2019

Вот решение на основе формата:

data table1;
  length id id1 id2 id3 id4 id5 8;
  infile datalines missover;
  input id id1 id2 id3 id4 id5;
  cards;
1005    2005    3005    4005    5005    7105
3005    4005    5005    7105        
4005    5005    7105            
5005    7105                
2005    3005    4005    5005    7105    
7105                    
;
run;

data table2;
  length id 8 names $ 10;
  input id names;
  cards;
1005    John
3005    Rick
4005    Sam
5005    Harry
2005    Mary
7105    Deena
;
run;

* Create a CNTLIN data set defining the required format;
data fmt_in;
  set table2;
  fmtname = 'names';
  start = id;
  label = names;
run;

* Run PROC FORMAT to generate the format from the CNTLIN data set;
proc format cntlin=fmt_in;
run;

* Apply the format to the input data set;
data out;
  set table1;
  namesID  = put(id, names.);
  namesID1 = put(id1, names.);
  namesID2 = put(id2, names.);
  namesID3 = put(id3, names.);
  namesID4 = put(id4, names.);
  namesID5 = put(id5, names.);
run;

Это будет очень эффективно для больших входов, поскольку не требует многократных сортировок.В общем, конечно, ваш входной набор данных table1 должен быть нормализован, чтобы быть высоким и тонким, чтобы был только один столбец, содержащий идентификаторы;это сделало бы решение на основе слияния тривиальным, хотя, вероятно, все еще медленнее, чем использование формата.

...