我有两个或三个人组成的独特小组。每个人都有一个变量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
感谢您的帮助
答案 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_
变得更容易理解。在实际迭代循环之前将循环的值赋值。