【问题标题】:How to rotate a SAS dataset by 90 degrees?如何将 SAS 数据集旋转 90 度?
【发布时间】:2022-12-09 09:51:37
【问题描述】:

数据集是 6 行 6 列,就像一个矩阵。我想将它旋转 90 度。 我有的:

data have;
  input v1-v6;
  cards;
1 1 1 0 0 0
1 1 0 0 0 0
1 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
;
run;

我想要的是一个像这样的数据集(或只是导致日志窗口):

0 0 0 1 1 1
0 0 0 0 1 1
0 0 0 1 0 1
0 0 1 0 0 0
0 1 0 0 0 0
1 0 0 0 0 0

我可以通过使用数组来实现这一点,并像这样执行循环:

data _null_;
  array v[6];
  array t[6,6];
  do until(eof);
    set have end=eof;
    i+1;
    do j=1 to 6;
      t[j,i]=v[j];
    end;
  end;

  do i=1 to 6;
    do j=1 to 6;
      put t[i,7-j]@;
    end;
    put;
  end;
run;

我正在寻找另一种方法来实现这一目标,也许proc iml
感谢您的任何提示。

【问题讨论】:

  • 您只是颠倒了一行中值的顺序吗?或者你实际上是在转置矩阵?

标签: matrix sas


【解决方案1】:

为什么不直接更改变量名呢?

data want(rename=(z1-z6=v1-v6));
  retain z1-z6;
  set have (rename=(v1-v6=z6-z1));
run

;

【讨论】:

  • 真的很棘手,我以前没有这样想过。我固执地做了旋转的事>_<
【解决方案2】:

您需要的是来自Rotating matrices using SAS/IML 的 Rot270() 函数。

proc iml;
start Rot270(m);
   return(T(m[nrow(m):1,])); /* up-down flip, then transpose */
finish;
 
m = {1 1 1 0 0 0,
     1 1 0 0 0 0,
     1 0 1 0 0 0,
     0 0 0 1 0 0,
     0 0 0 0 1 0,
     0 0 0 0 0 1};
m270 = rot270(m);
print m270;
0 0 0 1 1 1
0 0 0 0 1 1
0 0 0 1 0 1
0 0 1 0 0 0
0 1 0 0 0 0
1 0 0 0 0 0

更一般地,旋转矩阵是通过以下单行 SAS/IML 函数完成的:

proc iml;
start Rot90(m);
   return(T(m[,ncol(m):1]));       /* left-right flip, then transpose */
finish;
 
start Rot180(m);
   return(m[nrow(m):1,ncol(m):1]); /* left-right flip, up-down flip */
finish;
 
start Rot270(m);
   return(T(m[nrow(m):1,]));       /* up-down flip, then transpose */
finish;
 
m = {1 1 1 0 0 0,
     1 1 0 0 0 0,
     1 0 1 0 0 0,
     0 0 0 1 0 0,
     0 0 0 0 1 0,
     0 0 0 0 0 1};
m90 = rot90(m);
m180 = rot180(m);
m270 = rot270(m);
print m m90 m180 m270;
    m                m90  
1 1 1 0 0 0      0 0 0 0 0 1
1 1 0 0 0 0      0 0 0 0 1 0
1 0 1 0 0 0      0 0 0 1 0 0
0 0 0 1 0 0      1 0 1 0 0 0
0 0 0 0 1 0      1 1 0 0 0 0
0 0 0 0 0 1      1 1 1 0 0 0

    m180             m270  
1 0 0 0 0 0      0 0 0 1 1 1
0 1 0 0 0 0      0 0 0 0 1 1
0 0 1 0 0 0      0 0 0 1 0 1
0 0 0 1 0 1      0 0 1 0 0 0
0 0 0 0 1 1      0 1 0 0 0 0
0 0 0 1 1 1      1 0 0 0 0 0

【讨论】:

  • 非常令人印象深刻!你是里克威克林吗?我搜索了“SAS 数据集旋转”,但错过了这篇文章。
  • @whymath 我希望我是!我记得几个月前读过这篇文章:)
猜你喜欢
  • 2010-11-21
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多