代码之家  ›  专栏  ›  技术社区  ›  78282219

SAS:将行转换为矩阵

  •  -1
  • 78282219  · 技术社区  · 8 年前

    嗨,我在为暑期学校做一个项目,那个教书的人喜欢排着队工作。我认为把它变成一个矩阵和数组是有益的。

    当前数据集如下所示:

    data longdata;
    input var1 var2 Value;
    datalines;
    
    rowone colone 1
    rowone coltwo 1
    rowone colthree 2
    rowone colfour 3
    rowtwo colone 1
    rowtwo coltwo 1
    rowtwo colthree 1
    rowtwo colfour 2
    rowthree colone 3
    rowthree coltwo 3
    rowthree colthree 3
    rowthree colfour 4
    rowfour colone 1
    rowfour coltwo 3 
    rowfour colthree 3
    rowfour colfour 3
    ;
    run;
    

    我想把上面的话变成这个,最好是通过一个附带声明:

    data matrixdata;
    input var1-var4;
    datalines;
    
           colone coltwo colthree colfour
    rowone       1      1      2        2
    rowtwo       1      1      1        2
    rowthree     3      3      3        4
    rowfour      1      3      3        3
    ;
    run;
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Richard    8 年前

    Proc transpose 非常适合将分类数据转换为其他布局形式。

    proc transpose data=have out=want;
      by var1 notsorted;
      id var2;
      var value;
    run;
    

    尽管看起来像一个数组,但数据并不是一个隐式数组。要在一个隐式数据步迭代期间成为4x4数组,传入的数据集实际上需要每行16个变量,例如 v1-v16 ,具有值 1 1 2 3 1 1 1 2 3 3 3 4 1 3 3 3 . 每一行对应一个数组实例。

    data want2;
      retain v1-v16;
      array v (16) v1-v16;
      set have end=end;
      v(_n_) = value;
      if end;
      keep v:;
    run;
    
    data _null_;
      set want2;
      array m(4,4) v1-v16;
      do row = 1 to dim(m,1);
      do col = 1 to dim(m,2);
        put row= col= m(row,col)=;
      end;
      end;
    run;