如何在SAS(可能的PROC SQL)中更改数据布局?

时间:2013-12-30 23:43:47

标签: sql sas

使用SAS(我正在考虑使用PROC SQL或PROC TRANSPOSE,但我也对其他方法持开放态度):有关如何使用以下数据格式转换数据的任何提示:

ID CODE VALUE  
AA 1A   100  
AA 1A    10  
AA 2B   120  
AA 2C   210  
AA 3A   110  
BB 1A    20  
BB 3A   112

采用以下格式:

ID 1A  2B  2C  3A   
AA 110 120 210 110  
BB  20   .   . 112`

我需要做的是创建一个表格,其中原始表格中“CODE”变量的值成为我第二个表格中的表格标题。

我试图使用PROC TRANSPOSE,但由于我的“BY”条件(变量“CODE”)不是唯一的,它不会起作用:

PROC TRANSPOSE DATA=table1 OUT=table2;
    BY ID;
    ID CODE;
    VAR VALUE;
PROC PRINT DATA=table2;
    TITLE 'Test of flipped data';
RUN;

非常感谢任何反馈。感谢。

2 个答案:

答案 0 :(得分:2)

您需要在TRANSPOSE之前聚合VALUE列。有很多方法,我在这里展示SQL。

proc sql noprint;
   create table temp as
      select id, code, sum(value) as value
         from table1
         group by id, code
         order by id, code;
quit;

proc transpose data=temp out=table2;
    BY ID;
    ID CODE;
    VAR VALUE;
PROC PRINT DATA=table2;
    TITLE 'Test of flipped data';
RUN;

答案 1 :(得分:0)

如果ID和CODE相同,您似乎需要将VALUE加在一起。例如当ID = AA和CODE = 1A时,您希望只有一个唯一的行,其中VALUE = 110。

您可以在retain步骤中使用DATA来计算总和。具有PROC SORT选项的NODUPKEY仅在检测到指定变量之间的重复时保留具有最高值的记录。

data test2;
    set test;
    retain retainID retainCODE VALUE;
    if ID=retainID and CODE=retainCODE then SUM+VALUE; 
    else SUM=VALUE;
    retainID=ID;
    retainCODE=CODE;
    drop retainID retainCODE;
run;
proc sort data=test2;
    by ID CODE descending SUM;
run;    
proc sort data=test2 nodupkey;  *Use NODUPKEY to keep row with highest SUM;
    by ID CODE;                 *Checks for duplicates between ID and CODE;
run;
proc transpose data=test2 out=fat;
    by ID;
    ID CODE;
    var SUM;
run;
proc print data=fat noobs; run;
在这种情况下,

proc transpose可能是将数据集设置为胖数据集的更简单方法。 http://support.sas.com/resources/papers/proceedings09/060-2009.pdf否则,您将不得不使用数据步骤,这将是一个痛苦。