如何在SAS中转换(转置)数据集,以便变量名称成为类标识符?

时间:2016-01-06 04:24:24

标签: dataset sas

如何借助sas代码转换下表:

ID   T       U
1   1253    1349
2   1139    1382
3   1633    1663
4   1372    1541
5   1502    1335

进入此表?

ClassID     All
T          1253
T          1139
T          1633
T          1372
T          1502
U          1349
U          1382
U          1663
U          1541
U          1335

PS:我确实尝试使用sas sql(加入所有),但无法将T和U变量转换为类标识符)

3 个答案:

答案 0 :(得分:2)

这就是Redirect("http://google.com/",200)创建的目的。如果您希望按新的ClassID变量排序记录,那么您还需要添加PROC TRANSPOSE

PROC SORT

答案 1 :(得分:1)

这是使用DATA步骤的强力方法:

data test;
  input ID T U;
  cards;
1   1253    1349
2   1139    1382
3   1633    1663
4   1372    1541
5   1502    1335
;

data test;
  set test;
  keep ClassID All;
  ClassID = "T"; All = T; output;
  ClassID = "U"; All = U; output;
proc sort data=test out=test;
  by ClassID;
run;

答案 2 :(得分:1)

为避免对任何值进行硬编码,请创建一个循环遍历每个记录的数组,并使用vname函数读取当前变量名称。此变量名称分配给ClassID,变量值分配给All。如果所有变量都是数字变量,我的代码就可以工作,如果混合了数字和字符变量,你需要调整它(如果是这样的话,只需为字符变量创建另一个数组)。

/* create initial dataset */
data have;
input ID T U;
datalines;
1   1253    1349
2   1139    1382
3   1633    1663
4   1372    1541
5   1502    1335
;
run;

/* transform data into required dataset */
data want (keep=classid all); /* only keep wanted variables */
set have (drop=ID); /* don't read in ID as it's not needed */
array vars{*} _numeric_; /* set up array of all remaining variables (assume all numeric) */
do i = 1 to dim(vars); /* loop through each value */
    classID=vname(vars{i}); /* set ClassID to current variable name */
    all = vars{i}; /* set All to current value */
    output;
end;
run;

/* sort data by ClassID */
proc sort data=want;
by classid;
run;