我第一次尝试使用SAS宏。我的基本问题是:我有一个包含10000个变量的数据集。我需要单独获取每个列,创建一个新的条件变量,存储结果,然后移动到下一列。这些列不按顺序排序。 SAS用于识别列的语法是什么(类似于“ _ N _ ”将如何识别行)?
以下是更多信息。 数据看起来像这样:
ID v1 v2 v3 ... v10000
01 3.2 1.5 7.8 ... 4.2
02 1.1 4.5 1.9 ... 10.7
..
N 2.5 1.5 4.9 ... 7.3
我需要查看v1的值,计算值x上方有多少个obs,以及多少个值低于x值,在数据集中记录这些数字,然后转到v2,v3,... v10000。最后,我有一个数据集,可以显示我的10000个变量中每个变量值的x值以及数值低于x的数量。
我编写了代码,因为我会为标准SAS代码中的一个变量编写代码并且它可以工作,现在我的目的是将代码转换为宏代码,但我不知道如何构造一个循环从一列移到下一列。
非常感谢您提供的任何帮助或参考资料。
感谢。
答案 0 :(得分:3)
%LET CUTOFF = 3.1415926 ; /* set this as your 'cutoff' value */
data counters ;
set mydata end=eof ;
array vi{*} v1-v10000 ; /* incoming values */
array vc{*} c1-c10000 ; /* counters */
retain vc . ;
do i = 1 to dim(vi) ;
if vi{i} >= &CUTOFF then vc{i} + 1 ;
end ;
if eof then output ;
keep c1-c10000 ;
run ;
答案 1 :(得分:0)
不会是最有效的方式,但这将为您提供10000个单独的数据集。
%macro splitdata;
%do i=1 %to 10000;
data v_&i;
set v;
array vArray[10000] v1-v10000;
keep vArray[&i];
run;
%end splitdata;
%splitdata;
从那里你可以在每个数据集v_1,v_2,....上使用相同类型的宏do循环。