2015-12-11 145 views
0

是否可以用简单的方式增加不同的前缀变量名称?例如,如果我的数据集具有列Score1一路Score20,我可以简单地做:增量变量名称

input Score1-Score20; 

但如果我有Score1秩1共1页到Score20 Rank20 Total20,有没有办法来增加这些无需手动打出每一个?所以结果如下所示:

Score1 Rank1 Total1 Score2 Rank2 Total2 Score3 Rank3 Total3 etc... 

回答

2

您是否在意变量是否以不同于输入文件中的顺序创建?如果不是,则使用ARRAY。试试这个例子。

data x ; 
    array x(3,20) a1-a20 b1-b20 c1-c20 ; 
    infile cards truncover; 
    do block=1 to 20; 
    do item=1 to 3; 
    input x(item,block) @; 
    end; 
    end; 
    put (_all_) (=); 
    list; 
cards; 
1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 
; 

如果你需要它们,那么你需要使用某种类型的代码生成。

您可以创建一个简单的函数样式宏来发出名称列表。

%macro namelist(baselist,n); 
%local i j; 
%do i=1 %to &n ; 
%do j=1 %to %sysfunc(countw(&baselist)); 
    %scan(&baselist,&j)&i 
%end; 
%end; 
%mend namelist; 
... 
input %namelist(Rank Total Score,20) ; 

或者您可以使用一个简单的数据步骤将列表构建到宏变量中。

data _null_; 
    length i 8 basename $30 namelist $32000; 
    do i=1 to 20 ; 
    do basename='Rank ','Total','Score'; 
     namelist=catx(' ',namelist,cats(basename,i)); 
    end; 
    end; 
    call symputx('namelist',namelist); 
run; 
... 
input &namelist ; 
+0

是的,我只是想知道是否有一个简单的方法来创建变量的顺序 – coderX

+0

好的回答汤姆。在你的%namelist定义中,我认为你希望第二个参数是n。 – Quentin

+0

@Quentin谢谢。固定。 – Tom

0

您可能可以为此做一个宏。我认为这会工作:

%macro mymacro(runs); 
    %do i=1 %to &runs; 
     input Score&i Rank&i Total&i; 
     run; 
    %end; 
%mend create; 
%mymacro(20) 

尝试这里更好的文档:https://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000543755.htm

+0

这是行不通的,除非有各集之间的换行符 - 你需要使用@或构建您的宏不同(不包括输入语句,例如,刚创建变量列表)。 – Joe

+0

是的,这似乎没有做到这一点。这似乎是一个很好的开始,虽然 – coderX