在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;
答案 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;