SAS proc转置和输出到excel

时间:2011-05-05 13:23:34

标签: excel sas transpose

我的另一个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   |

有没有办法获得第一个所需的输出?

2 个答案:

答案 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文件,您可以在其中精确控制输出的输出方式,但需要花费更多精力来学习如何执行此操作。