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

时间:2014-05-13 14:28:29

标签: 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)) 
      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;

我的目标是尝试自动化我的6000个变量的代码片段,并保持我的方式,例如使用merge

结果将所有变量都如下所示。 ...代表其余变量

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;

我需要陈述 2 的事情

1)我有一个包含所有不同变量名称的数据集/表(例如var14,var28 ......)。如果我可以使用它会很棒。数据集的名称为dicoAg

2)我需要保留merge由于某些我无法在此讨论的原因。

如果您有任何见解

2 个答案:

答案 0 :(得分:0)

每个人,

没有详细说明,我的男人和我做了那个

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&&pays&l是变量的最大数量 &&&&var&&pays&l.._&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...

最佳。

答案 1 :(得分:0)

我开始创建测试数据集(显然你已经拥有它们):

%MACRO P;
%DO I=1 %TO 6;
data aat_&I;
    %DO J=1 %TO 6000;
        var&J=&J;
    %END;
    nouv_date=1;output;
run;
%END;
%MEND;
%P;

然后我使用proc contents来获取变量列表(您可以跳过此步骤并使用dicoAg):

proc contents data=aat_1 varnum out=vars;run;

然后你有sas为你写rename代码:

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;