SAS 转置使用名称的一部分
SAS transpose using a part of the name
我在这里寻求有关 proc 转置问题的帮助。
我有一个这样制作的数据集(我打算只显示 3 个变量,但我有很多)
PR ID VAR1a VAR1b VAR1c VAR2a VAR2b VAR2c VAR3a VAR3b VAR3c
1 1 x x x x x x x x x
1 2 x x x x x x x x x
1 3 x x x x x x x x x
2 1 x x x x x x x x x
2 2 x x x x x x x x x
2 3 x x x x x x x x x
我需要这样的输出数据集:
PREID ID VAR(name) A B C
1 1 VAR1(name) x x x
1 1 VAR2(name) x x x
1 1 VAR3(name) x x x
1 2 VAR1(name) x x x
1 2 VAR2(name) x x x
1 2 VAR3(name) x x x
1 3 VAR1(name) x x x
1 3 VAR2(name) x x x
1 3 VAR3(name) x x x
等,preid 2 id 1 2 3,preid 3 id 1 2 3.
所以我需要转置但使用名称(区别于 a b c),我真的不知道从哪里开始。
你能帮帮我吗?
如果我能够正确理解输出。我认为要达到这个结果,首先将输入数据的每个观察结果分成几个不同的观察结果。因此,单个观察将转换为 9(var1a 到 var3c)个观察(您可以通过 pr 和 id 变量使用 proc 转置并将 var1a 转置到 var3c 变量来实现)。在使用数据步之后,您需要将 _NAME__ 变量分解为 var1/2/3 和 a/b/c。完成此操作后,您应该能够转置数据以实现您的结果。
我试着根据你输入的数据写下代码。如果有帮助,请告诉我。
data input;
infile datalines dsd dlm=',' missover;
input PR :.
ID :.
VAR1a :.
VAR1b :.
VAR1c :.
VAR2a :.
VAR2b :.
VAR2c :.
VAR3a :.
VAR3b :.
VAR3c :.;
datalines4;
1,1,x,x,x,x,x,x,x,x,x
1,2,x,x,x,x,x,x,x,x,x
1,3,x,x,x,x,x,x,x,x,x
2,1,x,x,x,x,x,x,x,x,x
2,2,x,x,x,x,x,x,x,x,x
2,3,x,x,x,x,x,x,x,x,x
;;;;
run;
proc transpose data=input out=staging ;
by pr id ;
var VAR1a--VAR3c;
run;
data staging;
set staging;
var=substrn(strip(_name_),1,length(strip(_name_))-1);
dummy=substrn(strip(_name_),length(strip(_name_)),1);
drop _name_;
run;
proc transpose data=staging out=final(drop=_name_);
by pr id var;
id dummy;
var col1;
run;
proc print data=final;run;
与上述@sushil 解决方案类似,但少了一步。由于无论如何都必须进入数据步骤,因此您也可以转置该步骤中的数据。因此,在此解决方案中,Proc Transpose/Data 步骤被组合在一起。如果你的变量足够少,我也会删除最后一个转置,但如果你有很多变量,这会更灵活。
data input;
infile datalines dsd dlm=',' missover;
input PR :.
ID :.
VAR1a :.
VAR1b :.
VAR1c :.
VAR2a :.
VAR2b :.
VAR2c :.
VAR3a :.
VAR3b :.
VAR3c :.;
datalines4;
1,1,x,x,x,x,x,x,x,x,x
1,2,x,x,x,x,x,x,x,x,x
1,3,x,x,x,x,x,x,x,x,x
2,1,x,x,x,x,x,x,x,x,x
2,2,x,x,x,x,x,x,x,x,x
2,3,x,x,x,x,x,x,x,x,x
;;;;
run;
data out1;
set input;
array vars(*) var1a--var3c;
do i=1 to dim(vars);
name=vname(vars(i));
varname=substr(name,1,length(name)-1);
group=substr(name,length(name));
value=vars(i);
output;
end;
drop var1a--var3c;
run;
proc transpose data=out1 out=out2;
by pr id varname;
id group;
var value;
run;
我在这里寻求有关 proc 转置问题的帮助。
我有一个这样制作的数据集(我打算只显示 3 个变量,但我有很多)
PR ID VAR1a VAR1b VAR1c VAR2a VAR2b VAR2c VAR3a VAR3b VAR3c
1 1 x x x x x x x x x
1 2 x x x x x x x x x
1 3 x x x x x x x x x
2 1 x x x x x x x x x
2 2 x x x x x x x x x
2 3 x x x x x x x x x
我需要这样的输出数据集:
PREID ID VAR(name) A B C
1 1 VAR1(name) x x x
1 1 VAR2(name) x x x
1 1 VAR3(name) x x x
1 2 VAR1(name) x x x
1 2 VAR2(name) x x x
1 2 VAR3(name) x x x
1 3 VAR1(name) x x x
1 3 VAR2(name) x x x
1 3 VAR3(name) x x x
等,preid 2 id 1 2 3,preid 3 id 1 2 3.
所以我需要转置但使用名称(区别于 a b c),我真的不知道从哪里开始。 你能帮帮我吗?
如果我能够正确理解输出。我认为要达到这个结果,首先将输入数据的每个观察结果分成几个不同的观察结果。因此,单个观察将转换为 9(var1a 到 var3c)个观察(您可以通过 pr 和 id 变量使用 proc 转置并将 var1a 转置到 var3c 变量来实现)。在使用数据步之后,您需要将 _NAME__ 变量分解为 var1/2/3 和 a/b/c。完成此操作后,您应该能够转置数据以实现您的结果。
我试着根据你输入的数据写下代码。如果有帮助,请告诉我。
data input;
infile datalines dsd dlm=',' missover;
input PR :.
ID :.
VAR1a :.
VAR1b :.
VAR1c :.
VAR2a :.
VAR2b :.
VAR2c :.
VAR3a :.
VAR3b :.
VAR3c :.;
datalines4;
1,1,x,x,x,x,x,x,x,x,x
1,2,x,x,x,x,x,x,x,x,x
1,3,x,x,x,x,x,x,x,x,x
2,1,x,x,x,x,x,x,x,x,x
2,2,x,x,x,x,x,x,x,x,x
2,3,x,x,x,x,x,x,x,x,x
;;;;
run;
proc transpose data=input out=staging ;
by pr id ;
var VAR1a--VAR3c;
run;
data staging;
set staging;
var=substrn(strip(_name_),1,length(strip(_name_))-1);
dummy=substrn(strip(_name_),length(strip(_name_)),1);
drop _name_;
run;
proc transpose data=staging out=final(drop=_name_);
by pr id var;
id dummy;
var col1;
run;
proc print data=final;run;
与上述@sushil 解决方案类似,但少了一步。由于无论如何都必须进入数据步骤,因此您也可以转置该步骤中的数据。因此,在此解决方案中,Proc Transpose/Data 步骤被组合在一起。如果你的变量足够少,我也会删除最后一个转置,但如果你有很多变量,这会更灵活。
data input;
infile datalines dsd dlm=',' missover;
input PR :.
ID :.
VAR1a :.
VAR1b :.
VAR1c :.
VAR2a :.
VAR2b :.
VAR2c :.
VAR3a :.
VAR3b :.
VAR3c :.;
datalines4;
1,1,x,x,x,x,x,x,x,x,x
1,2,x,x,x,x,x,x,x,x,x
1,3,x,x,x,x,x,x,x,x,x
2,1,x,x,x,x,x,x,x,x,x
2,2,x,x,x,x,x,x,x,x,x
2,3,x,x,x,x,x,x,x,x,x
;;;;
run;
data out1;
set input;
array vars(*) var1a--var3c;
do i=1 to dim(vars);
name=vname(vars(i));
varname=substr(name,1,length(name)-1);
group=substr(name,length(name));
value=vars(i);
output;
end;
drop var1a--var3c;
run;
proc transpose data=out1 out=out2;
by pr id varname;
id group;
var value;
run;