proc变量名称转置

时间:2017-11-07 09:47:23

标签: sas

我有一个数据集如下

AGE GENDER
11   F
12   M
13
15

现在我想创建一个数据集,如下所示

基本上我想在另一列中使用变量名。

或者可能在一列中

VAR Value
AGE  11
AGE  12   
AGE  13
AGE  15
GENDER F
GENDER M 

我尝试了普通的proc转置,但看起来并没有给出理想的结果。

2 个答案:

答案 0 :(得分:2)

这不是严格意义上的转置。转置意味着您希望将某些列转换为行,反之亦然,这不是这种情况。转置的样本数据如下所示:

VAR    VALUE1 VALUE2 VALUE3 VALUE4
----------------------------------
AGE    11     12     13     14
GENDER F      M

您在此处尝试执行的操作是将所有变量放在同一列中并添加“标签”列。

您可以通过data步骤获得所需的结果:

data have;
infile datalines missover
;
input age $ gender $;
datalines;
11 F
12 M
13
15
;
run;

data want;
length var $6;
set have(keep=age rename=(age=value) in=a)
    have(keep=gender rename=(gender=value) where=(value is not missing) in=b);
if b then var='GENDER';
else if a then var='AGE';
run;

请注意where=语句第二部分的set数据集选项,因为您所需的结果不包含示例数据中gender的缺失值。

或者,您可以使用两个proc transpose

进行此操作
proc transpose data=have out=temp name=VAR;
var age gender;
run;

proc transpose data=temp out=want(drop=_name_ rename=(col1=VALUE) where=(VALUE is not missing));
var col1 col2 col3 col4;
by var;
run;

答案 1 :(得分:1)

一种解决方案是引入一个新的唯一行标识符,并在BY语句中使用它。这将使TRANSPOSE在每一行中转动数据值。

data have;
rownum + 1; * new variable for pivoting by row via BY statement;
input AGE GENDER $;
datalines;
11   F
12   M
13   . 
15   .
run;

proc transpose data=have out=want(drop=_name_ rename=(col1=value) where=(value ne ''));
by rownum;
var age gender;
run;

在Proc TRANPOSE中,默认的新列名称以COL为前缀,并以传入行中值1..n的出现次数为索引。人工rownum和BY语句确保透视数据只有一个数据列。注意:前缀可以使用选项PREFIX =指定,另外如果使用ID语句,则数据透视的数据列名称可以来自数据本身。

混合数据类型可能是个问题,因为新列将使用基础数据值的字符表示。所以日期将会出现,因为最初格式化的数字和数字会丢失其格式。

如果您正在尝试进行JSON传输,我建议您研究JSON库引擎或Proc DS2的JSON包。

如果您希望使用此转置形状的数据创建报告,我建议您使用Proc TABULATE。