(我很难给出一个好的描述性标题,所以我仅以示例的方式提出。)
我有一个这样的数据集:
|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制表的工作原理,但是并没有设法使它满足我的需求。可能是我吠错了树。有办法吗?
我不需要它来返回数据表,只需一些屏幕输出即可。
答案 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