SAS:以特定方式显示数据

SAS:以特定方式显示数据,sas,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 ...) | | A's | B's | C's | +---+-----+-----+-----+ | 1

(我发现很难给出一个好的描述性标题,所以我将通过一个例子来提问。)

我有这样一个数据集:

|ID | A1 A2 A3 | B1 B2 B3 | C1 C2 C3 |
+---+----------+----------+----------+
| 1 |  a aa aaa| b  bb bbb| c  cc ccc|
| 2 |  (... some values, etc ...) 
|   | A's | B's | C's |
+---+-----+-----+-----+
| 1 |  a  |  b  |  c  |
| 2 |  aa | bb  |  cc |
| 3 | aaa | bbb | ccc |
我想做的是,给定一个“ID”,用该ID的值A1、A2等生成一个表输出,如下所示:

|ID | A1 A2 A3 | B1 B2 B3 | C1 C2 C3 |
+---+----------+----------+----------+
| 1 |  a aa aaa| b  bb bbb| c  cc ccc|
| 2 |  (... some values, etc ...) 
|   | A's | B's | C's |
+---+-----+-----+-----+
| 1 |  a  |  b  |  c  |
| 2 |  aa | bb  |  cc |
| 3 | aaa | bbb | ccc |
所以,概括一下:我想选择一行,并输出一个表,其中某些变量显示在列中。我试着让我的头脑围绕着proc tablate是如何工作的,但没有设法说服它给我想要的东西;也许我找错人了。有办法做到这一点吗


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

您可以通过创建一个在三个阵列上并行运行的转置视图来重塑数据。然后可以使用Proc报告或打印生成演示输出

样本数据

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子句输出。用于在输出中显示id值的BY语句

proc report data=have_v;
  by id;
  where id = 3;
  column id seq a b c;
  define id / display noprint;    
run;
如果不想生成输出,可以使用VIEWTABLE并发出WHERE命令


如果每一行包含任意数量的任意长度(如1到15)的“数组”(如a到z),您可能希望编写一个宏,对相关数据集执行元数据检查。检查将试图发现数组“名称”和每个数组中的元素数。这意味着需要发现并输出给定id的15行26列。

您可以通过创建在三个阵列上并行运行的转置视图来重塑数据。然后可以使用Proc报告或打印生成演示输出

样本数据

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子句输出。用于在输出中显示id值的BY语句

proc report data=have_v;
  by id;
  where id = 3;
  column id seq a b c;
  define id / display noprint;    
run;
如果不想生成输出,可以使用VIEWTABLE并发出WHERE命令


如果每一行包含任意数量的任意长度(如1到15)的“数组”(如a到z),您可能希望编写一个宏,对相关数据集执行元数据检查。检查将试图发现数组“名称”和每个数组中的元素数。对于一个给定的id,say需要发现并输出15行26列。

听起来像是旧式数据报告可以产生的东西

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

听起来像是老式数据报告可能产生的结果

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

值是字符还是数字?是否要放弃输出中的ID值?ID=2的值应该放在哪里?在ID=1对应的3行下面?如果不清楚,我很抱歉:我想手动选择一个ID,并获得一个输出表,以某种紧凑的形式显示该行中的数据,如图所示。这是为了帮助人眼,避免在我想检查一些数据时必须滚动很长的行。这些值是字符还是数字?是否要放弃输出中的ID值?ID=2的值应该放在哪里?在ID=1对应的3行下面?如果不清楚,我很抱歉:我想手动选择一个ID,并获得一个输出表,以某种紧凑的形式显示该行中的数据,如图所示。这是为了帮助人眼,避免在我想要检查一些数据时必须滚动很长的行。