简化我桌子的描述,使我的问题简洁.
我有一个3列的数据集。第一列包含100 成本类别(即唯一键),第二列包含给定成本类别的成本,第三列包含销售的单位。
我的目标是将其转换为一个表,该表包含每个CostCat的列,其中包含该给定类别的成本字段的和,该字段按UnitsSold分组。
即
╔════════════╦══════════╦══════════╦═══════
║ UnitsSold ║ CatCost1 ║ CatCost2 ║ CostCat...
╠════════════╬══════════╬══════════╬═══════
║ 1 ║ 50 ║ 10 ║ ...
║ 2 ║ 20 ║ 15 ║ ...
║ ... ║ ... ║ ... ║ ...
╚════════════╩══════════╩══════════╩═══════我倾向于使用这样的代码:
PROC SQL;
CREATE TABLE cartesian AS
SELECT
UnitsSold,
SUM(CASE WHEN CostCat=1 THEN Cost else 0 end) as CostCat1,
sum(case when CostCat=1 then Cost else 0 end) as CostCat2,
sum(case when CostCat=1 then Cost else 0 end) as CostCat3,
...
sum(case when CostCat=100 then Cost else 0 end) as CostCat100
GROUP BY UnitsSold;
QUIT;我想知道是否有一种比写出大量荒谬的案例陈述更有效的方法?(显然,使用Excel生成实际的类型)。
我想可能有某种类型的宏循环,但对宏还不太熟悉,还不知道如何实现。
我传统上使用PROC SQL,所以这是我的首选,但也向SAS代码解决方案开放。
发布于 2017-12-01 21:46:36
正如Reeza所指出的,最好的方法可能是将proc sql、proc means/summary和proc transpose结合起来。我假设您了解SQL,所以我将首先讨论这个描述。
proc sql;
create table tmp as
select UnitsSold, CostCat, sum(cost) as cost
from have
group by UnitsSold, CostCat;
quit;如果您想通过SAS过程执行此操作,则可以使用proc summary。
proc summary data=have nway missing;
class UnitsSold CostCat;
var Cost;
output out=tmp(drop=_:) sum=; ** drop=_: removes the automatic variables created in the procedure;
run;既然表已经通过UnitsSold和CostCat进行了总结和排序,那么就可以转到表中了。
proc transpose data=tmp out=want(drop=_NAME_) prefix=CostCat;
by UnitsSold;
id CostCat;
var cost;
run;https://stackoverflow.com/questions/47600847
复制相似问题