SAS:在Proc转置中使用Do/Loop
我不太熟悉SAS中的Do循环,希望得到一些帮助。我有如下数据: 产品A:1 产品A:2 产品A:4 我想转置(easy)并标记缺少产品A:3,但我需要迭代到第I级,因为产品的数量很大 如果我在SAS中运行转置部分,我的第一列将是1,第二列将是2,第三列将是4-但是我真的希望第三列丢失,第四列是4 有什么想法吗?谢谢。获取一些示例数据: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; 确定我们需要转置到的最大列。根据您的情
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丢失了呢?基本上你需要一个拥有所有选项的源,然后通过完全连接或交叉连接合并它们,这样你就拥有了所有的记录。