Sas 如何克服调用执行(catt(datastep))中的计算复杂性

Sas 如何克服调用执行(catt(datastep))中的计算复杂性,sas,time-complexity,Sas,Time Complexity,在这种数据步骤中 ID VAR_1 VAR_2 VAR_3 ... 1 a1 b1 mv ... 2 a2 b2 mv ... 3 a3 b3 c3 ... 4 a4 mv mv ... 5 a5 b5 mv ... 6 a6 b6 mv ... 在变量数量未知的情况下(我希望尽可能地概括我的代码),我希望获得这样的数据集(类似于反向过程转置):

在这种数据步骤中

ID  VAR_1  VAR_2 VAR_3 ...
1   a1     b1    mv    ...
2   a2     b2    mv    ...
3   a3     b3    c3    ...
4   a4     mv    mv    ...
5   a5     b5    mv    ...
6   a6     b6    mv    ...
在变量数量未知的情况下(我希望尽可能地概括我的代码),我希望获得这样的数据集(类似于反向过程转置):

因此,我将数据集拆分为非固定数量的临时数据集,其中一个包含ID,只有一列,用缺少的值破坏观测值,然后我将合并所有这些临时数据集以获得结果。这是有效的。 但是调用execute的计算复杂度非常高,我的意思是,如果我尝试在只有一列的数据集中执行此操作(删除缺少的值),我的垃圾计算机需要0.1秒,而在有6列的数据集中使用调用execute则不需要0.1*6=0.6秒,需要几分钟。这是因为它不会在列中工作,而是在行中,这是SAS,我必须克服它。但是我在问我自己(现在我在问你们)是否有其他方法可以在没有计算时间的情况下获得我的结果。这里重点介绍代码:

data _null_;                                                                                                                                                             
set old;                                                                                                                                                             
array try[*] VAR: ;                                                                                                                                                      
do i=1 to DIM(try);                                                                                                                                                      
call execute(catt("data var",i,"; set old; if var_",i," = ' ' then delete; allvarnew= col",i,";                 `                 `drop COL:; run;" ));                                                      
end;                                                                                                                                                                     
run; 
列是char$1(ID是char$4)。 列是proc转置的结果。
谢谢。

我不确定这是否有效,但它只需要一个数据步骤,而不是所述的调用执行方法中的多个数据步骤:

data new (drop=var_: i);
  set test;
  array try[*] VAR_: ;
  do i=1 to DIM(try);
    var=try[i]; output;
  end;
run;

谢谢你的尝试!这管用!而且它也比我的解决方案简单得多!
data new (drop=var_: i);
  set test;
  array try[*] VAR_: ;
  do i=1 to DIM(try);
    var=try[i]; output;
  end;
run;