我有一个关于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应该等于每组的最大值,并且对于每组的所有观察值都是相同的。在本例中,Group number 1有4个值。它们是10、8、7、10,其中最大值是10,所以第一组B列的观测值都等于10,第二组B列的观测值最大值是13,所以第二组B列的观测值都等于13。
列C更为复杂。它的值取决于所有列。类似于B列,在组内也是一样。更详细地说,它是具体观察量列的总和。这些特定的观测值应该属于每组中具有最大值的观测值。在我们的示例中,第一组为12。原因是,第一组的最大数量是10,属于10的数量是7和5,所以这些的和是12,对于第二组是15,因为第二组的最大值是13,属于13的数量是6和9,所以我希望和是15。我可以解释。在此之前,非常感谢您。
发布于 2017-03-26 00:48:48
您可以使用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;如果数据来自底层数据库,大多数数据库都支持窗口函数,这使得这一点变得更容易。
发布于 2017-03-26 03:50:45
这是未经测试的(我离开了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;https://stackoverflow.com/questions/43019001
复制相似问题