Sas 使用merge命令行合并6000个变量

Sas 使用merge命令行合并6000个变量,sas,Sas,我有以下问题,我不知道如何做到这一点 我正试图通过下面的代码合并6000个变量 请在下面找到我为其中两个变量编写的代码 data big_aat_1; merge Aat_1(rename=(var14=var14_t0 var28=var28_t_0)) Aat_2(rename=(var14=var14_t_1 var28=var28_t_1)) Aat_3(rename=(var14=var14_t_2 var28=var28_t_2)) Aa

我有以下问题,我不知道如何做到这一点

我正试图通过下面的代码合并6000个变量

请在下面找到我为其中两个变量编写的代码

data big_aat_1; 
merge Aat_1(rename=(var14=var14_t0  var28=var28_t_0)) 
      Aat_2(rename=(var14=var14_t_1 var28=var28_t_1)) 
      Aat_3(rename=(var14=var14_t_2 var28=var28_t_2)) 
      Aat_4(rename=(var14=var14_t_3 var28=var28_t_3)) 
      Aat_5(rename=(var14=var14_t_4 var28=var28_t_4))
      Aat_6(rename=(var14=var14_t_5 var28=var28_t_5)); 
by nouv_date;
run;
data big_aat_1; 
merge Aat_1(rename=(var14=var14_t0 var28=var28_t_0 var37=var37_t_0 ...)) 
      Aat_2(rename=(var14=var14_t_1 var28=var28_t_1 var37=var37_t_1 ...)) 
      Aat_3(rename=(var14=var14_t_2 var28=var28_t_2 var37=var37_t_2 ...)) 
      Aat_4(rename=(var14=var14_t_3 var28=var28_t_3 var37=var37_t_3 ...)) 
      Aat_5(rename=(var14=var14_t_4 var28=var28_t_4 var37=var37_t_4 ...))
      Aat_6(rename=(var14=var14_t_5 var28=var28_t_5 var37=var37_t_5 ...)); 
by nouv_date;
run;
我的目标是尝试为我拥有的6000个变量自动化我的一段代码,并保持我的方式,例如使用
合并

结果将是所有变量都与下面的一样。
表示其余变量

data big_aat_1; 
merge Aat_1(rename=(var14=var14_t0  var28=var28_t_0)) 
      Aat_2(rename=(var14=var14_t_1 var28=var28_t_1)) 
      Aat_3(rename=(var14=var14_t_2 var28=var28_t_2)) 
      Aat_4(rename=(var14=var14_t_3 var28=var28_t_3)) 
      Aat_5(rename=(var14=var14_t_4 var28=var28_t_4))
      Aat_6(rename=(var14=var14_t_5 var28=var28_t_5)); 
by nouv_date;
run;
data big_aat_1; 
merge Aat_1(rename=(var14=var14_t0 var28=var28_t_0 var37=var37_t_0 ...)) 
      Aat_2(rename=(var14=var14_t_1 var28=var28_t_1 var37=var37_t_1 ...)) 
      Aat_3(rename=(var14=var14_t_2 var28=var28_t_2 var37=var37_t_2 ...)) 
      Aat_4(rename=(var14=var14_t_3 var28=var28_t_3 var37=var37_t_3 ...)) 
      Aat_5(rename=(var14=var14_t_4 var28=var28_t_4 var37=var37_t_4 ...))
      Aat_6(rename=(var14=var14_t_5 var28=var28_t_5 var37=var37_t_5 ...)); 
by nouv_date;
run;
有两件事我需要陈述

1) 我有一个数据集/表,其中包含所有不同的变量名(例如var14、var28…)。如果我能用它就好了。数据集的名称为
dicoAg

2) 我需要保留
合并
,因为有些原因我不能在这里讨论

如果你对每个人都有所了解

没有详细说明,我和我的男朋友就这么做了

data big_aat_1;
merge %do j=1 %to 6 ; Aat_&j(rename=(%do i=1 %to &&&&nvar&&pays&l  ; &&&&var&&pays&l.._&i=&&&&var&&pays&l.._&i.._t%eval(&j-1) %end ; )) %end ; ;
by nouv_date;
run;
不是完美的,也不是超级高效的,但是做的很好

说明:

&&&&&nvar&&PAYES&l
是变量的最大数量
&&&&var&&pays&l..\u&i
是变量

结果会给你类似的东西

 merge Aat_1(rename=( var1=var1_t0 var31=var31_t0 var60=var60_t0 var90=var90_t0 var119=var119_t0 ...

Aat_6(rename=( var1=var1_t5 var31=var31_t5 var60=var60_t5 var90=var90_t5 var119=var119_t5...

最好。

我开始创建测试数据集(显然您已经有了):

然后我使用了
proc contents
来创建变量列表(您可以跳过这一步,使用
dicoAg
):

然后让sas为您编写
重命名
代码:

data _NULL_;                                    
    set vars /*dicoAg*/(where=(NAME^="nouv_date")) end=fine;
    file "MyPath\Rename.sas"; 
    if _N_=1 then do;       
        put '%MACRO RENAME(J=);   ';                             
        put '(rename=(         ';    
    end; 
    /*intead of NAME use the variable in dicoAg which contains all the variables' names*/ 
    put '           ' NAME '=' NAME +(-1) '_&J';  
    if fine then do;                      
        put '      ))            ';                        
        put '%MEND;           ';                          
    end;
run;   
包括以下代码:

%include "MyPath\Rename.sas";
最后,编写宏进行合并:

%MACRO P;
data big_aat_1; 
    merge
        %DO D=1 %TO 6;
            aat_&D. %RENAME(J=&D)
        %END;
    ;
    by nouv_date;
run;
%MEND;
%P;

我想用一个双循环的宏。。。你觉得怎么样?谢谢@user3645882。我明天就试试那个。再次感谢你的帮助。