我的数据如下表所示,我想将其转置,就像在 excel 中使用数据透视表一样,但在 SAS 中。我尝试过 proc 转置,但收到“错误:ID 值“'**'n”在同一个 BY 组中出现两次。”
有(称之为长):
班级 | 年份 | Dev_Qtr | 付费_损失 | 公司_损失 |
---|---|---|---|---|
A 段 | 2004年 | 3 | 1000000 | 1500000 |
A 段 | 2004年 | 6 | 950547 | 1425820.5 |
A 段 | 2004年 | 9 | 971746 | 1457619 |
A 段 | 2004年 | 15 | 912356 | 1368534 |
A 段 | 2004年 | 18 | 26916 | 40374 |
A 段 | 2004年 | 21 | 235696 | 353544 |
A 段 | 2004年 | 27 | 641805 | 962707.5 |
A 段 | 2004年 | 30 | 653554 | 980331 |
B 段 | 2004年 | 3 | 1000000 | 1500000 |
B 段 | 2004年 | 6 | 634698 | 952047 |
B 段 | 2004年 | 9 | 956788 | 1435182 |
B 段 | 2004年 | 15 | 18532 | 27798 |
B 段 | 2004年 | 18 | 686824 | 1030236 |
B 段 | 2004年 | 21 | 289675 | 434512.5 |
B 段 | 2004年 | 27 | 462303 | 693454.5 |
B 段 | 2004年 | 30 | 591880 | 887820 |
想要(称之为宽):
班级 | 年份 | 金额 | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
A 段 | 2004年 | 美元_付费_损失 | 1000000 | 950547 | 971746 | 912356 | 26916 | 235696 | 641805 | 653554 | ||
A 段 | 2004年 | 美元增量损失 | 1500000 | 1425820.5 | 1457619 | 1368534 | 40374 | 353544 | 962707.5 | 980331 | ||
B 段 | 2004年 | 美元_付费_损失 | 1000000 | 634698 | 956788 | 18532 | 686824 | 289675 | 462303 | 591880 | ||
B 段 | 2004年 | 美元增量损失 | 1500000 | 952047 | 1435182 | 27798 | 1030236 | 434512.5 | 693454.5 | 887820 |
我尝试运行的代码是
proc transpose data=Long out=Wide name=Amount;
id Dev_Qtr;
var Paid_Loss Inc_Loss;
by Class Year;
run;
错误为“ERROR: ID 值“'**'n”在同一个 BY 组中出现两次。”
是否可以创建一个输出,就像我试图通过 proc 转置在 SAS 中实现的那样,或者是否有更好的方法来做到这一点?我展示的数据示例在同一年的各个季度有 2 个类别,但实际数据将以这种方式跨越 10 年的历史。也许这需要一些循环?
将不胜感激任何帮助!我绝不是 SAS 专家,这显然超出了我通常的驾驶范围!
总结一下评论讨论:
by
和 id
变量值的每个组合只能有一个记录。这就是错误所指示的内容。id
使用 formatted 值,因此虽然底层数值是唯一的,但格式化的值却不是(可能是由于格式宽度不足)。 PROC TRANSPOSE
尝试在 by
组中创建相同的变量两次并出错。修复的格式是这样的。