我对SAS编程有疑问。这是有条件的和。但这对我来说非常具体。因此,我想问一个例子。我有以下数据集:
Group A Quantity
1 10 7
1 8 4
1 7 3
1 10 5
2 11 6
2 13 8
2 9 7
2 13 9
我想在此数据集中再添加两列。新数据集应为:
Group A Quantity B NewColumn
1 10 7 10 12 (7+5)
1 8 4 10 12
1 7 3 10 12
1 10 5 10 12
2 13 6 13 15 (6+9)
2 10 8 13 15
2 9 7 13 15
2 13 9 13 15
因此,B列应该等于每组的最大值,并且对于每组的所有观察结果都是相同的。在此示例中,组号1具有4个值。它们是10,8,7,10。这些值中的最大值是10.因此,第一组的B列的观察值都等于10.第2组的最大数量是13.因此,第二组B列的观察值均等于13。
C列更复杂。它的值取决于所有列。与B列类似,它在组内是相同的。更详细,它是QUANTITIES列的具体观察的总和。这些具体观察结果应属于每组中具有最大值的观察结果。在我们的例子中,第一组是12。原因是,第一组的最大数量是10.而属于10的数量是7和5.因此,这些的总和是12.对于第二组,它是15.因为第二组的最大值是13和属于13的数量是6和9.所以总和是15。 我希望。我可以解释一下。提前谢谢了。
答案 0 :(得分:0)
您可以使用proc sql
:
proc sql;
select t.*, max_a as b,
(select sum(t2.quantity)
from t t2
where t2.group = t.group and t.a = max_a
) as c
from t join
(select group, max(a) as max_a
from t
group by group
) g
on t.group = g.group;
run;
如果数据来自底层数据库,大多数数据库都支持窗口函数,这使得这更容易。
答案 1 :(得分:0)
这是未经测试的(我远离sas)并且可能会有错误,但是三重DoW循环应该可以工作。一次获得每组最大值,第二次获得总和,第三次传递输出记录。类似的东西:
data want ;
do until(last.group) ;
by group ;
set have ;
B=max(A,B) ;
end ;
do until(last.group) ;
set have ;
by group ;
if A = B then NewColumn = sum(NewColumn, Quantity) ;
end;
do until(last.group);
set have ;
by group;
output ;
end ;
run;