【问题标题】:How to transform (transpose) a dataset in SAS, so that variables names become class identifiers? [duplicate]如何在 SAS 中转换(转置)数据集,使变量名称成为类标识符? [复制]
【发布时间】:2016-01-06 04:24:23
【问题描述】:

如何在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 来(join all),但无法将 T 和 U 变量转换为类标识符)

【问题讨论】:

  • 这个问题有很多答案 - this onethis one 等。搜索“[sas] wide to long”。
  • 以及那些拥有 3k+ 代表的人 - 在发布肯定会有答案的事情的答案之前,请搜索重复项 :)
  • @Joe 是的,您是对的,我的问题看起来与您建议的重复问题非常相似。我在 Google 中搜索了 sas table transform,当然我没有想到使用“sas transpose wide to long”之类的搜索,直到现在我根本不知道这个 sas 术语。但我认为我的重复问题现在对变换/转置数据集类型的问题有三个最佳答案。这就是为什么我喜欢重复和半重复 :) 我将在问题标题中包含转置一词,以使其更具相关性。也可以随意填写。

标签: dataset sas


【解决方案1】:

这就是 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;

【讨论】:

  • 感谢您的回答,您的代码运行良好,但我使用了以下答案中的代码,因此必须将其标记为答案。
【解决方案2】:

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

【讨论】:

  • 感谢您提供详尽且非常有帮助的答案。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多