Optimization SAS删除以十为索引的多个变量

Optimization SAS删除以十为索引的多个变量,optimization,sas,Optimization,Sas,我的问题可能很愚蠢,但我还没有找到答案。 我有一个十位数的可变var指数:var10,var20。。。var90。 在我的代码的某个点上,我想删除所有的代码 我能行 data want(drop=var10 var20 var30 var40 var50 var60 var70 var80 var90); set have; run; 我想知道是否有一种更简洁的方法可以做到这一点。我知道如果有索引为10,11,12,13的变量。。。我可以用 (drop=var10-90) 但是,由于

我的问题可能很愚蠢,但我还没有找到答案。 我有一个十位数的可变var指数:var10,var20。。。var90。 在我的代码的某个点上,我想删除所有的代码

我能行

data want(drop=var10 var20 var30 var40 var50 var60 var70 var80 var90);
    set have;
run;
我想知道是否有一种更简洁的方法可以做到这一点。我知道如果有索引为10,11,12,13的变量。。。我可以用

(drop=var10-90)
但是,由于我没有它们,如果我使用这个指令,它仍然起作用,但是有一个警告,这对我来说是不可接受的,我必须创建一个程序,供那些几乎没有编程知识的人使用,以便他们报告像这样的警告


提前感谢

如果您想要删除所有共享一个共同前缀的变量,那么您可以按如下操作,注意不要有任何共享相同前缀的变量,您不想删除它们!:

data want(drop=var:);
    set have;
run;
如果var变量都是10的倍数,即没有以var开头的其他变量,则可以使用冒号运算符,冒号运算符充当通配符,例如

drop var: ; /* drop all variables beginning with 'var' */ 或者,您可以动态生成所有变量的列表:

proc sql noprint ; select name into :VARLIST separated by ' ' from dictionary.columns where libname = 'WORK' and memname = 'HAVE' and compress(name,,'ka') = 'VAR' and mod(input(compress(name,,'kd'),8.),10) = 0 /* convert var<xx> to xx and check divisible by 10 */ order by name ; quit ; data want (drop=&VARLIST) ; set have ; run ;
您可以保持下拉列表不变,并在执行数据步骤之前关闭警告:

options dkrocond=nowarn;

通常,我会在使用下拉列表执行数据步骤后立即重新打开警告

我没有理由不列出这九个变量中的每一个。在程序中压缩文本可能很好,但在这种情况下,您收获很少,并且会失去清晰度

如果您关心标签的优化,那么我肯定不会在程序中添加额外的步骤,尤其是查询字典表的步骤

如果要执行此操作,请假设要删除100多个变量,只需使用一个简单的宏来创建列表:

%macro varlist;
%do i = 10 %to 90 %by 10;
var&i
%end;
%mend varlist;
然后调用宏:

data want(drop=%varlist);
    set have;
run;
我对这篇文章进行了大量的编辑,以反映乔的评论

另一种可能的方法是使用双破折号符号,但应谨慎使用

drop var10--var90;
套用乔的评论:

它会删除数据库中这两个变量之间发生的每个变量 变量列表,即从左到右查看数据集,或 在proc内容输出中以varnum顺序。它们之间有任何变量吗 不管他们从什么开始都会被抛弃

下面的示例显示变量x也将被删除,因为它存在于数据集中的变量v10和v30之间。一个潜在的危险结果,但仍然是一个潜在的解决方案:

data x;
  v10 = 1;
  x = 'a';
  v30 = 1;
  drop v10--v30;
run;

不完全是我想要的,但对这个案子有效,谢谢!我想没有比这更好的了?我在上面的答案中添加了一个动态派生的解决方案。动态解决方案不仅会删除var,还会删除其他可以被10整除的列,比如keep。这可以通过在where子句中添加1=indexname,'var'来解决。您的建议还包括相应编辑的varname10、varname20等。另外,当您进行大量模拟时,var1-100这一假设技术也很有用,其他程序也可以使用它。有了我提出的解决方案,实际上我可能会列出变量。@AnthonyMartin说得对。如果有更多的变量,这将非常有用。此外,我还从我的答案中删除了一个无关的分号。我认为对dictionary.tables的查询不应该对程序的计时产生重大影响——我们现在讨论的是一两秒钟。总的来说,我认为数据驱动的程序优于这样的宏,但肯定会有这样的情况。@Joe我之所以提到字典表,是因为它们可能很慢,而且可能需要优化。我不同意在不需要数据驱动的解决方案时实施它们。似乎OP只是想压缩类似于数据集列表的文本,但标准不同于允许的标准。我们必须同意不同意。我不喜欢硬编码这样的东西——尽管在一次性程序中这是合适的。