我的问题可能很愚蠢,但我还没有找到答案。 我有一个变量 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)
但是因为我没有它们,如果我使用这个指令它仍然可以完成这项工作,但是有一个警告,这对我来说是不可接受的(我必须创建程序,这些程序将由几乎没有编程的人使用知识,以便他们报告这样的警告。
提前致谢
答案 0 :(得分:5)
如果var<xx>
变量都是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 ;
答案 1 :(得分:4)
您可以按原样保留下拉列表,并在数据步骤前关闭警告:
options dkrocond=nowarn;
通常情况下,我会在DATA步骤之后用下拉列表重新打开警告。
答案 2 :(得分:4)
我没有看到很好的理由不列出九个变量中的每一个。程序中的压缩文本可能很好,但在这种情况下,你获得的收益很少,而且你会失去清晰度。
如果您关注&#34;优化&#34; (你的标签)然后我肯定会避免在你的程序中添加额外的步骤,尤其是查询字典表的步骤。
如果你想这样做(比如你要删除100多个变量),只需使用一个简单的宏来创建列表:
%macro varlist;
%do i = 10 %to 90 %by 10;
var&i
%end;
%mend varlist;
然后调用宏:
data want(drop=%varlist);
set have;
run;
答案 3 :(得分:1)
如果您想删除所有共享共同前缀的变量,那么您可以按照以下方式执行操作(请注意,您没有任何共享相同前缀但您不想要的变量删除):
data want(drop=var:);
set have;
run;
答案 4 :(得分:1)
我在原帖中大大编辑了这篇帖子,以反映Joe的评论。
另一种可能的方法是使用双划线表示法,但应谨慎使用。
drop var10--var90;
用乔的评论来解释:
它删除了在这两个变量之间发生的每个变量 变量列表(即,当您查看数据集时,从左到右,或 以proc内容输出中的varnum顺序)。他们之间的任何变量 无论他们从什么开始,都会被放弃。
以下示例显示变量x
也将被删除,因为它存在于数据集中的变量v10和v30之间。一个潜在的危险结果,但仍然是一个潜在的解决方案:
data x;
v10 = 1;
x = 'a';
v30 = 1;
drop v10--v30;
run;