我从Proc Univariate输出'Moments'到数据集。许多。
示例:Moments_001.sas7bdat到Moments_237.sas7bdat
对于每个数据集的第一列(新添加的第一列,可能是新的数据集,而不是原始数据集),我希望在每个单元格中都有一个特定的文本,直到最后一行。
确切的文本将是相应数据集文件的名称:例如,“Moments_001”。
如果不可能的话,我不必“抓住”文件名。我知道名字已经是什么了,我可以将该文本放入程序中。但是,从我的角度来看,如果可能的话,抓取文件名会更容易。
我非常感谢任何人可以提供任何帮助来实现这一目标。
谢谢, Nicholas Kormanik
答案 0 :(得分:2)
您是否正在寻找SET语句的INDSNAME
选项?您需要定义两个变量,因为该选项生成的变量会自动删除。
data want;
length moment dsn $41 ;
set Moments_001 - Moments_237 indsname=dsn ;
moment=dsn;
run;
答案 1 :(得分:0)
将蛮力输入第1列的文字如下:
data moments_001;
length text $ 16;
set moments_001;
text="Moments_001";
run;
您还可以编写一个循环遍历所有237个数据集并插入文本的宏。
未经审查的代码
%macro do_all;
%do i=1 %to 237;
%let num = %sysfunc(putn(&i,z3.));
data moments_#
length text & 16;
set moments_#
text="Moments_&num";
run;
%end;
%mend
%do_all
在我看来(不知道你的问题)如果你使用带有BY选项的PROC UNIVARIATE,那么你不需要237个不同的数据集,你的所有输出都在一个数据集中,而BY变量将也在数据集中。这会解决你的问题吗?
答案 2 :(得分:0)
我认为沿着这些方向的东西应该是你所追求的。假设您有一个时刻列表,您可以遍历它并添加一个新变量作为每个数据集的第一列。
%let list_of_moments = moments_001 moments_002 ... moments_237;
%macro your_macro;
%do i = 1 %to %sysfunc(countw(&list_of_moments.));
%let this_moment = %scan(&list_of_moments., &i.);
data &this_moment._v2;
retain new_variable;
set &this_moment.;
new_variable = "&this_moment.";
run;
%end;
%mend your_macro;
%your_macro;