我正在与sas合作操纵一些数据集。我正在使用数据步骤来应用一些条件来保持列和过滤某些值。问题是我想过滤最终我不需要的列,所以我想首先应用where子句,然后应用keep子句。问题是sas执行,首先执行keep子句,然后执行where,所以当它尝试应用where指令时,它找不到应该应用它的列。这是我的代码:
data newtable;
set mytable(where=(var1<value)
keep var2);
end;
在这种情况下,错误是无法找到var1,因为我决定只保留var2。我知道我可以做两个数据步骤,但我只想一步完成所有事情。我怎样才能做到这一点?
这可以通过在输出数据集上使用keep
数据集选项来实现,例如(未经测试):
data newtable(keep=var2);
set mytable(where=(var1<value));
end;
或者,可以使用keep
语句,例如, (未经测试):
data newtable;
set mytable(where=(var1<value));
keep var2;
end;
@Amir有权利。 @Quentin担心这一切的效率。除非你的where子句涉及很多,否则这将是你最有效的方法。
data newtable;
set mytable(where=(var1<value) keep=var1 var2);
keep var2;
end;
是的,var1
被读入PDV,但是您已将PDV限制为仅在输出中需要的变量并且在where子句中需要。
如果您只想运行where而不执行其他数据步骤逻辑,则PROC SQL与上述方法一样高效。
proc sql noprint;
create table newtable as
select var2
from mytable
where var1<value;
quit;