如何在 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;
如何借助 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;