【问题标题】:SAS transpose using a part of the name使用名称的一部分进行 SAS 转置
【发布时间】:2015-05-19 15:45:10
【问题描述】:

我在这里寻求帮助以解决 proc transpose 的问题。

我有一个这样制作的数据集(我将只显示 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),我真的不知道从哪里开始。 你能帮帮我吗?

【问题讨论】:

    标签: sas dataset transpose


    【解决方案1】:

    如果我能够正确理解输出。我认为要达到这个结果,首先对输入数据的每个观察都将分解为几个不同的观察。因此,单个观察将被转换为 9(var1a 到 var3c)观察(您可以通过 pr & id 变量使用 proc 转置并将 var1a 转置到 var3c 变量来实现)。在此使用数据步之后,您需要将 _NAME__ 变量分解为 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;
    

    【讨论】:

      【解决方案2】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 2021-03-20
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多