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,并获得一个输出表,以某种紧凑的形式显示该行中的数据,如图所示。这是为了帮助人眼,避免在我想要检查一些数据时必须滚动很长的行。