SAS:在Proc转置中使用Do/Loop

SAS:在Proc转置中使用Do/Loop,sas,transpose,Sas,Transpose,我不太熟悉SAS中的Do循环,希望得到一些帮助。我有如下数据: 产品A:1 产品A:2 产品A:4 我想转置(easy)并标记缺少产品A:3,但我需要迭代到第I级,因为产品的数量很大 如果我在SAS中运行转置部分,我的第一列将是1,第二列将是2,第三列将是4-但是我真的希望第三列丢失,第四列是4 有什么想法吗?谢谢。获取一些示例数据: proc sort data=sashelp.iris out=sorted; by species; run; 确定我们需要转置到的最大列。根据您的情

我不太熟悉SAS中的Do循环,希望得到一些帮助。我有如下数据:

产品A:1 产品A:2 产品A:4

我想转置(easy)并标记缺少产品A:3,但我需要迭代到第I级,因为产品的数量很大

如果我在SAS中运行转置部分,我的第一列将是1,第二列将是2,第三列将是4-但是我真的希望第三列丢失,第四列是4

有什么想法吗?谢谢。

获取一些示例数据:

proc sort data=sashelp.iris out=sorted;
  by species;
run;
确定我们需要转置到的最大列。根据您的情况,您可能只想使用
%let max=somevalue语句:

proc sql noprint;  
  select cats(max(sepallength)) into :max from sorted;
quit;

%put &=max;
使用数据步骤转换数据:

data want;
  set sorted;
  by species; 
  retain _1-_&max;

  array a[1:&max] _1-_&max;

  if first.species then do;
    do cnt = lbound(a) to hbound(a);
      a[cnt] = .;
    end;
  end;

  a[sepallength] = sepallength;

  if last.species then do;
    output;
  end;

  keep species _1-_&max;
run;
请注意,我们正在定义一个列数组:
\u1、\u2、\u3、\umax
。这发生在我们的
array
语句中


然后,我们使用分组处理一次为单个物种填充这些新创建的列。对于每个物种,在第一个记录中,我们清除阵列。对于物种的每个记录,我们填充数组中适当的元素。在物种的最终记录上输出数组内容。

您需要一种方法来告诉SAS您有4种产品,值为1-4。在本例中,我使用所需信息创建虚拟ID,然后使用ID语句进行转置,以使用product的值命名新变量

data product;
   input id product @@;
   cards;
1 1 1 2 1 4
2 2 2 3
;;;;
   run;
proc print;
   run;
data productspace;
   if 0 then set product;
   do product = 1 to 4;
      output;
      end;
   stop; 
   run;
data productV / view=productV;
   set productspace product;
   run;
proc transpose data=productV out=wide(where=(not missing(id))) prefix=P;
   by id;
   var product;
   id product;
   run;
proc print;
   run;

这是缺少级别的问题,您希望输出是什么,您尝试了什么?理想情况下,我希望输出的外观为:产品A:1 2。4但当我转置时,我的数据看起来像:产品A:1 2 4我现在正在进行过程总结,这很好,但当我每个月都要复制时,它是不可伸缩的。它实际上是数字吗?你怎么能确定3丢失了呢?基本上你需要一个拥有所有选项的源,然后通过完全连接或交叉连接合并它们,这样你就拥有了所有的记录。