首页 > 解决方案 > 循环更新分配

问题描述

我有这样的数据:

 Subject  Treatment X 
 1            1     X12
 2            2     X12
 3            3     X13
 4            1     X11
 5            2     X13
 6            3     X12
 7            1     X11
 8            2     X12
 9            1     X11
 10           3     X13

我必须使用变量 Z 来计算 X 的数量,所以 Z11=#of X11's , Z12=#of X12's 等等,但如果 X 和 T 中的最后一个数字相同,那么你在分配中添加一个。

所以 Z11=X11+1 if T=1, Z12=X12+1 If T=2 and Z13=X13+1 if T=3 但是如果最后一个数字和 T 不对应,那么它将保持不变 Z11 =X11,Z12=X12,Z13=13。我正在使用 proc sql 来计算分配,但每次循环通过另一个主题时,我不知道如何添加 1。

proc sql;
create table new1 as select 
sum(y="X11")+1 as z11,
sum(y="X12") as z12,
 sum(y="X13") as z13
 from dynamic;
 quit;

任何帮助将不胜感激。

标签: loopscountsas

解决方案


我不清楚您到底想要什么,但我会在创建所需变量的数据步骤中执行此操作,然后总结总数。

data have;
input  Subject  Treatment X $;
datalines;
 1            1     X12
 2            2     X12
 3            3     X13
 4            1     X11
 5            2     X13
 6            3     X12
 7            1     X11
 8            2     X12
 9            1     X11
 10           3     X13
;

data have;
set have;
z11 = 0;
z12 = 0;
z13 = 0;
if x="X11" then do;
    z11 = z11 + 1;
    if Treatment=1 then
        z11 = z11+1;
end;
else if x="X12" then do;
    z12 = z12 + 1;
    if Treatment=2 then
        z12 = z12 + 1;
end; 
else if x="X13" then do;
    z13 = z13 + 1;
    if Treatment=3 then
        z13 = z13+1;
end;
run;

proc summary data=have;
var z:;
output out=want sum=;
run;

产生:

                         _TYPE_    _FREQ_    z11    z12    z13

                             0        10       6      6      5

如果需要,您可以删除_TYPE_和变量。_FREQ_


推荐阅读