使用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;
非常感谢任何反馈。感谢。
答案 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否则,您将不得不使用数据步骤,这将是一个痛苦。