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;