SAS:以特定方式显示数据

时间:2018-07-02 11:41:12

标签: sas

(我很难给出一个好的描述性标题,所以我仅以示例的方式提出。)

我有一个这样的数据集:

|ID | A1 A2 A3 | B1 B2 B3 | C1 C2 C3 |
+---+----------+----------+----------+
| 1 |  a aa aaa| b  bb bbb| c  cc ccc|
| 2 |  (... some values, etc ...) 

我想做的是,给定一个“ ID”,使该表的输出具有该ID的值A1,A2等,例如:

|   | A's | B's | C's |
+---+-----+-----+-----+
| 1 |  a  |  b  |  c  |
| 2 |  aa | bb  |  cc |
| 3 | aaa | bbb | ccc |

因此,回顾一下:我想选择一行,并输出一个表,其中某些变量显示在列中。我已经尝试过确定 proc制表的工作原理,但是并没有设法使它满足我的需求。可能是我吠错了树。有办法吗?

我不需要它来返回数据表,只需一些屏幕输出即可。

2 个答案:

答案 0 :(得分:2)

您可以通过创建在三个数组上并行操作的转置视图来重塑数据。然后可以使用Proc REPORT或PRINT生成演示输出。

样本数据

data have;
  do id = 1 to 10;
    array a a1-a3;
    array b b1-b3;
    array c c1-c3;

    do i = 1 to dim(a);
      a(i) = 10 ** i + id;
      b(i) = 2 * 10 ** i + id;
      c(i) = 3 * 10 ** i + id;
    end;
    output;

    keep id a: b: c:;
  end;
run;

换位视图

data have_v / view = have_v;
  set have;
  array as a1-a3;
  array bs b1-b3;
  array cs c1-c3;
  do seq = 1 to dim(as);
    a = as(seq);
    b = bs(seq);
    c = cs(seq);
    output;
  end;
  keep id seq a b c;
run;

带有where子句的输出。 BY语句用于在输出中显示id值。

proc report data=have_v;
  by id;
  where id = 3;
  column id seq a b c;
  define id / display noprint;    
run;

如果不想产生输出,可以使用VIEWTABLE并发出WHERE命令。

如果每一行包含任意数量但相等长度(例如 1 到)的任意数量的“数组”(例如 a z 15 ),您可能想编写一个宏来对相关数据集进行一些元数据检查。该检查将尝试发现每个数组中的“名称”和元素数。这种 say 将需要发现并输出给定​​ID的15行x 26列。

答案 1 :(得分:1)

听起来像旧样式数据_null_报告可能会产生的声音。

data _null_;
  set have ;
  where id=1 ;
  array a a1-a3 ;
  array b b1-b3 ;
  array c c1-c3 ;
  file print;
  put @10 'A' @20 'B' @30 'C' 
   /  @10 8*'-' @20 8*'-' @30 8*'-'
  ;
  do i=1 to dim(a);
   put i 8. @10 a(i) @20 b(i) @30 c(i) ;
  end;
run;

结果

     A         B         C
     --------  --------  --------
   1 a         b         c
   2 aa        bb        cc
   3 aaa       bbb       ccc