2011-05-05 190 views
2

从我的另一个SAS的问题(我注意到这些不来这里,往往...):SAS PROC转,输出到excel

我有一个包含这样的数据集:

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我其实Concat的我的类别和水平,我的数据集(如使其“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

没有SAS问题不经常出现在这里。对于更关注于SAS的社区,请参阅www.runsubmit.com – 2011-05-06 12:16:57

回答

3

假设您熟悉您的ODS选项以将其导入到Excel中(我只是懒惰地使用html并将其另存为.xls,但您可以使用标记集等代替),以下是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;
+0

再次感谢。我对ODS的熟悉程度并不高,但会更多地考虑它,因为proc报告确实提供了我需要的输出布局。现在只需要把它放到我的xls中。刚才,用'ods excelxp'尝试过,看起来不错(除了颜色:))。但我担心缺失值栏会变成一种痛苦。 – Yoh 2011-05-06 09:11:50

1

我不认为你将能够使用proc转置直接去你想要的输出,因为你正在寻求让每个类别跨越多个层次。您可能想要研究其他两个程序,REPORT和TABULATE。我相信你可以直接从任何一方做到这一点,但是我使用这些已经有好几年了。第三种选择是创建一个带有ODS的XML文件,在这个文件中,您可以非常精确地控制要输出的方式,尽管需要花费更多的精力来学习如何执行此操作。

+0

我尝试了下面的sasfrogs示例的Proc报告,并确实指向正确的方向来查找我的解决方案。稍后还会尝试处理列表。谢谢。 – Yoh 2011-05-06 09:13:12