假设你能告诉多少行每个变量的使用计数非遗漏值有多少列,那么你可以使用此代码生成技术来生成将使用POINT =选项设置数据的步骤语句循环遍历变量X的第一个Nx观察值。
首先获取变量名称列表;
proc transpose data=have(obs=0) out=names ;
var _all_;
run;
然后使用它们来生成PROC SQL select语句来计算每个变量的非缺失值的数量。
filename code temp ;
data _null_;
set names end=eof ;
file code ;
if _n_=1 then put 'create table counts as select ' ;
else put ',' @;
put 'sum(not missing(' _name_ ')) as ' _name_ ;
if eof then put 'from have;' ;
run;
proc sql noprint;
%include code /source2 ;
quit;
然后转置,这样你再有每个变量名一行但这次它也有COL1计数。
proc transpose data=counts out=names ;
var _all_;
run;
现在使用它来生成DATA步骤所需的SET语句以从输入创建输出。
filename code temp;
data _null_;
set names ;
file code ;
length pvar $32 ;
pvar = cats('_point',_n_);
put pvar '=mod(_n_-1,' col1 ')+1;' ;
put 'set have(keep=' _name_ ') point=' pvar ';' ;
run;
现在使用生成的语句。
data want ;
set have(drop=_all_);
%include code/source2;
run;
所以与变量A,B和C和7个总观测日志中产生的数据步的示例数据文件是这样的:
1229 data want ;
1230 set have(drop=_all_);
1231 %include code/source2;
NOTE: %INCLUDE (level 1) file CODE is file .../#LN00026.
1232 +_point1 =mod(_n_-1,7)+1;
1233 +set have(keep=a) point=_point1 ;
1234 +_point2 =mod(_n_-1,3)+1;
1235 +set have(keep=b) point=_point2 ;
1236 +_point3 =mod(_n_-1,2)+1;
1237 +set have(keep=c) point=_point3 ;
NOTE: %INCLUDE (level 1) ending.
1238 run;
NOTE: There were 7 observations read from the data set WORK.HAVE.
NOTE: The data set WORK.WANT has 7 observations and 3 variables.
来源
2017-06-23 22:24:57
Tom
在同一数据集所有这些是最初?看起来像一个不好的合并? – Reeza
是的,它实际上是一个“坏”合并。但是这不会影响目标。我想知道如何从矢量a,b和c得到这张决赛桌。 – fossekall
我问这个问题的原因是,如果你已经有了单独的数据集中的数据,它可以更容易地加载到临时数组或设置一个SQL步骤。首先“迈出”一步可能会使这个问题更容易处理。您已经有解决方案,因此您可以随意忽略这一点,因为您已经实现了“目标”。 – Reeza