使用名称的一部分进行SAS转置

使用名称的一部分进行SAS转置,sas,dataset,transpose,Sas,Dataset,Transpose,我在这里请求帮助解决proc转置的问题 我有一个这样制作的数据集(我将只显示3个变量,但我有很多变量) 我需要这样的输出数据集: 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 VAR

我在这里请求帮助解决proc转置的问题

我有一个这样制作的数据集(我将只显示3个变量,但我有很多变量)

我需要这样的输出数据集:

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
etc与preid 2 id 1 2 3,preid 3 id 1 2 3

所以我需要转置,但是使用这个名字(区别于a b c),我真的不知道从哪里开始。
如果我能正确理解输出,你能帮我吗?

。我认为要达到这个结果,首先,输入数据的每个观察值都会被分成几个不同的观察值。因此,单个观测值将转换为9个(var1a到var3c)观测值(您可以使用pr&id变量的proc转置和var1a到var3c变量的转置来实现)。在使用datastep之后,需要将_NAME_uu变量分解为var1/2/3和a/b/c。完成此操作后,您应该能够转换数据以获得结果

我试着根据你的输入数据写下代码。如果有帮助,请告诉我

data input;
infile datalines dsd dlm=',' missover;
input PR    :$8. 
      ID    :$8.  
      VAR1a :$8.  
      VAR1b :$8.  
      VAR1c :$8.   
      VAR2a :$8.  
      VAR2b :$8.  
      VAR2c :$8.  
      VAR3a :$8.  
      VAR3b :$8. 
      VAR3c :$8.;
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;

如果我能正确理解输出。我认为要达到这个结果,首先,输入数据的每个观察值都会被分成几个不同的观察值。因此,单个观测值将转换为9个(var1a到var3c)观测值(您可以使用pr&id变量的proc转置和var1a到var3c变量的转置来实现)。在使用datastep之后,需要将_NAME_uu变量分解为var1/2/3和a/b/c。完成此操作后,您应该能够转换数据以获得结果

我试着根据你的输入数据写下代码。如果有帮助,请告诉我

data input;
infile datalines dsd dlm=',' missover;
input PR    :$8. 
      ID    :$8.  
      VAR1a :$8.  
      VAR1b :$8.  
      VAR1c :$8.   
      VAR2a :$8.  
      VAR2b :$8.  
      VAR2c :$8.  
      VAR3a :$8.  
      VAR3b :$8. 
      VAR3c :$8.;
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转置/数据步骤是组合的。如果你有足够多的变量,我会删除最后的转置,但是如果你有相当多的变量,这是更灵活的

data input;
infile datalines dsd dlm=',' missover;
input PR    :$8. 
      ID    :$8.  
      VAR1a :$8.  
      VAR1b :$8.  
      VAR1c :$8.   
      VAR2a :$8.  
      VAR2b :$8.  
      VAR2c :$8.  
      VAR3a :$8.  
      VAR3b :$8. 
      VAR3c :$8.;
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;

类似于上面的@sushil解决方案,但少了一步。由于您必须进入数据步骤,因此您也可以在该步骤中转置数据。因此,在这个解决方案中,Proc转置/数据步骤是组合的。如果你有足够多的变量,我会删除最后的转置,但是如果你有相当多的变量,这是更灵活的

data input;
infile datalines dsd dlm=',' missover;
input PR    :$8. 
      ID    :$8.  
      VAR1a :$8.  
      VAR1b :$8.  
      VAR1c :$8.   
      VAR2a :$8.  
      VAR2b :$8.  
      VAR2c :$8.  
      VAR3a :$8.  
      VAR3b :$8. 
      VAR3c :$8.;
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;