使用proc转置计算观察次数

时间:2014-02-04 10:34:07

标签: sql sas

在SAS中,我有一个这样的表:

ID   ACTE 
1    A   
2    B  
1    A  
1    A  
2    C  
1    B  

我想拥有下表:

ID    A    B    C
 1    3    1    0
 2    0    1    1

第二个表是一个带有ID的表,对于ACTE列中可能的每个值,它是该ID发生的时间。

我想知道是否可以使用proc转置来完成它。

我尝试了这段代码,但却产生错误:

proc transpose data=OriginalTable out=TestTranspose;
    by ID;
    var Acte;
    id Acte;
 run;

2 个答案:

答案 0 :(得分:4)

您可以使用计算计数的中间步骤并将其传递给proc transpose。 例如:

PROC SQL;
CREATE VIEW OriginalTable_v as 
SELECT
ID
,ACTE 
,COUNT(*) AS FREQ
FROM OriginalTable
GROUP BY ID ,ACTE 
ORDER BY ID ,ACTE ;
QUIT;

proc transpose data=OriginalTable_v out=TestTranspose;
    by ID;
    var FREQ;
    id Acte;
 run;

注意:上述方法,如果ID&数据中不存在ACTE组合。换句话说,上面的输出将与您想要的输出相同,除非它有0的缺失值。

您可以在一个步骤中处理此问题的另一种方法 - 假设您事先知道ACTE中的类别,并且它们只是一个小的号码。他们将如下:

PROC SQL;
CREATE table TestTranspose2 as 
SELECT
ID
,sum(case when acte='A' then 1 else 0 end) as count_A
,sum(case when acte='B' then 1 else 0 end) as count_B
,sum(case when acte='C' then 1 else 0 end) as count_C
,sum(case when acte NOT IN ('A', 'B', 'C') then 1 else 0 end) as count_Other
,COUNT(*) AS FREQ_of_ids
FROM OriginalTable
GROUP BY ID
ORDER BY ID ;
QUIT;

在上面,产生与你的相同的输出0s,其中ID和& ACTE组合不存在。

答案 1 :(得分:3)

@ user102890答案的变体。我使用了Proc Freq获取计数,然后转换为一个宽数据集。稀疏选项为您提供零而不是缺少值,其中id和acte的组合不存在。

data have;
input ID   ACTE $;
datalines;
1    A 
2    B 
1    A 
1    A 
2    C 
1    B 
;
run;

proc freq data=have noprint;
table ID*ACTE / out=temp sparse;
run;

proc transpose data=temp out=want (drop=_:);
by ID;
id ACTE;
var COUNT;
run;