将文本插入sas数据集中第一列的所有单元格中

时间:2016-05-16 08:50:51

标签: sas

我从Proc Univariate输出'Moments'到数据集。许多。

示例:Moments_001.sas7bdat到Moments_237.sas7bdat

对于每个数据集的第一列(新添加的第一列,可能是新的数据集,而不是原始数据集),我希望在每个单元格中都有一个特定的文本,直到最后一行。

确切的文本将是相应数据集文件的名称:例如,“Moments_001”。

如果不可能的话,我不必“抓住”文件名。我知道名字已经是什么了,我可以将该文本放入程序中。但是,从我的角度来看,如果可能的话,抓取文件名会更容易。

我非常感谢任何人可以提供任何帮助来实现这一目标。

谢谢, Nicholas Kormanik

3 个答案:

答案 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;