如何对整个组中的值求和,然后将结果分配给SAS中的组中的每个人

时间:2019-01-14 04:12:35

标签: sas sum retain

我有两个或三个人组成的独特小组。每个人都有一个变量X(或缺失)的值。对于每个组,我想对该组中所有观察值求和,并将结果分配给该组中的每个人。

具有数据集

group ID X
1 110 2.5 1 111 1.0 1 112 0.0 2 210 . 2 211 5.6 3 212 2.0 3 213 1.5 4 310 . 4 311 7.2 4 312 2.1

还有我想要的带有新变量Y的数据集,像这样:

group ID X Y 1 110 2.5 3.5 1 111 1.0 3.5 1 112 0.0 3.5 2 210 . 5.6 2 211 5.6 5.6 3 212 2.0 3.5 3 213 1.5 3.5 4 310 . 9.3 4 311 7.2 9.3 4 312 2.1 9.3

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

假设您的表名为“ ds”:

PROC SQL;
    SELECT group, ID, x, sum(x) AS y
    FROM DS
    GROUP BY group;
QUIT;

答案 1 :(得分:1)

如果您的数据已被排序,则为Dow循环求解,然后按照@Richard在注释中的建议进行合并。

  /*DOW LOOP solution*/

   data want;
 do until(last.group);
 set have;
 by group;
if first.group then Y=X;
 else Y+X;
  end;
 do until(last.group);
   set have;
 by group;
output;
end;
run;

/* mean followed by merge solution*/
proc means data = have nway noprint;
class group;
var X;
output out=have1 ( keep = Group Y) sum=Y;
 run;



data want;
merge have have1;
by group;
run;

答案 2 :(得分:1)

@Kiran,您将以do … until作为终点条件的序列last.group的编码不起作用,因为尽管last.group=1的状态set;by;在第二个循环中仍然存在,并且因此第二个循环只重复一次。

在多夫曼(Dorfman)的长期支持下,更好的解决方案是使用1 by 1的第一个循环计算组大小的模式,然后是显式循环1 to _n_的第二个循环的模式

data have; input
group ID     X; datalines;
1     110     2.5
1     111     1.0
1     112     0.0
2     210     .
2     211     5.6
3     212     2.0
3     213     1.5
4     310     .
4     311     7.2
4     312     2.1
run;

data want;
  do _n_ = 1 by 1 until (last.group);
    set have;
    by group;
    groupsum = sum(groupsum,x);
  end;

  do _n_ = 1 to _n_ ;
    set have;
    output;  * group related computation result gets carried into the output data set (want);
  end;
run;

当编码器意识到SAS数据步骤评估 start stop by 时,模式部分do _n_ = 1 to _n_变得更容易理解。在实际迭代循环之前将循环的值赋值。