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

How to transform (transpose) a dataset in SAS, so that variables names become class identifiers?

如何借助 sas 代码转换以下内容 table:

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

进入这个table?

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 变量转换为 class 标识符)

这是一个使用 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;

为避免对任何值进行硬编码,创建一个循环遍历每条记录的数组,并使用 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;

这就是创建 PROC TRANSPOSE 的目的。如果您希望记录按新的 ClassID 变量排序,那么您还需要添加一个 PROC SORT.

proc transpose data=have
  out=want(rename=(_name_=ClassID col1=All))
;
  by id ;
  var T U ;
run;

proc sort;
  by classid id;
run;