我的另一个SAS问题(我注意到这些问题经常出现在这里......):
我有一个包含这样的数据集:
Name | Category | Level | Score
John | cat1 | 1 | 80
John | cat1 | 2 | 70
John | cat1 | 3 | 10
John | cat2 | 1 | 60
John | cat2 | 2 | 95
John | cat2 | 3 | 43
John | cat2 | 4 | 28
输出(excel格式)应如下所示:
| cat1 | cat2 |
name | 1 | 2 | 3 | 1 | 2 | 3 | 4 |
John | 80 | 70 |10 |60 |95 |43 |28 |
我现在所做的是使用proc transpose
以正确的顺序获取数据,然后使用proc export
转到.xls。
这项工作正常,除了一件事。我不能让第二层细分工作。所以现在,在我的proc transpose
之前,我实际上在我的数据集中连接了我的类别和级别(例如,使它成为'1_cat1'),然后转置此值,给我以下输出:
name | 1_cat1 | 2_cat1 | 3_cat1 | 1_cat2 | 2_cat2 | 3_cat2 | 4_cat2 |
John | 80 | 70 | 10 | 60 | 95 | 43 | 28 |
有没有办法获得第一个所需的输出?
答案 0 :(得分:3)
假设您熟悉ODS
选项以将其导入Excel(我只是懒得使用html并将其另存为.xls,但您可以使用tagset等),这里是一个PROC REPORT
解决方案,以您正在寻找的格式显示数据。检查在proc报告中使用across
变量。可能有一种方法可以抑制输出中cat1下未使用的列,但我现在无法回想起它。
data testData; infile datalines dsd delimiter='|'; input name $ category $ level score; datalines; John | cat1 | 1 | 80 John | cat1 | 2 | 70 John | cat1 | 3 | 10 John | cat2 | 1 | 60 John | cat2 | 2 | 95 John | cat2 | 3 | 43 John | cat2 | 4 | 28 ; run; ods html file="C:\SomePath\MyFile.xls"; proc report data=testData; columns name category,level,score; define name / group; define category / across ''; define level / across ''; define score / sum ''; run; ods html close;
答案 1 :(得分:1)
我不认为您可以使用proc转置直接转到所需的输出,因为您希望每个类别都跨越多个级别。您可能想要研究另外两个程序,REPORT和TABULATE。我相信你可以从任何一个直接做到这一点,但是自从我使用它们已经有好几年了。第三个选项是使用ODS创建一个XML文件,您可以在其中精确控制输出的输出方式,但需要花费更多精力来学习如何执行此操作。