我有一个数据集如下
AGE GENDER
11 F
12 M
13
15
现在我想创建一个数据集,如下所示
基本上我想在另一列中使用变量名。
或者可能在一列中
VAR Value
AGE 11
AGE 12
AGE 13
AGE 15
GENDER F
GENDER M
我尝试了普通的proc转置,但看起来并没有给出理想的结果。
答案 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。