根据条件从SAS数据集中删除变量(如果这样做)

时间:2018-01-18 09:18:36

标签: sas sas-macro

所以我已经在网上搜索了一些,但没有设法找到任何可以解决这个问题的东西。从本质上讲,我已经获得了一个数据集,然后我根据名称将其拆分为单个数据集。

但是,如果此人是女性,则需要从数据集中省略年龄。示例输出:

男性

名称年龄体重高度

女性

名称重量高度

我尝试过以下IF语句,但它似乎从男性和女性表中删除了年龄变量:

if sex="F" then do;
    drop age;
end;

我对SAS很新,所以非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

在SAS中运行数据步骤时,某些语句在编译期间处理,其他语句随后在执行期间处理。在这种情况下,drop语句会在if-then逻辑之前处理,因此您无法使用它来有条件地删除列。

或者,您可以为每个受影响的行输出age的缺失值,例如

if sex = 'F' then call missing(age);

或者您可以在一个输出数据集上使用drop子句,但不能在另一个输出数据集上使用:

data boys girls(drop=age);
  set sashelp.class;
  if sex = 'F' then output girls;
  else if sex = 'M' then output boys;
run;

答案 1 :(得分:0)

无法有条件地运行DROP语句。您需要有条件地生成DROP语句(或DROP = dataset选项)。

要使用简单的示例数据集,请从SASHELP.CLASS开始,并将其拆分为单个数据集。请注意,此数据集每个NAME只有一个观察值,但我会在代码生成步骤中添加BY组处理,以便您可以看到在每个名称有多个观察值的情况下如何使用它。

首先,让我们为生成多个输出数据集的单个DATA语句生成代码。根据SEX变量的值,它将有条件地添加DROP = dataset选项。

filename code temp;
data _null_;
  set sashelp.class end=eof ;
  by name ;
  file code ;
  if _n_=1 then put 'data' ;
  if first.name then do;
    put '  ' name @ ;
    if sex='F' then put '(drop=age)' @ ;
    put ;
  end;
  if eof then put ';' ;
run;

现在让我们附加将读取源数据集的其余数据步骤的代码,并将记录输出到相应的数据集。

data _null_;
  set sashelp.class end=eof ;
  by name ;
  file code mod ;
  if _n_=1 then put '  set sashelp.class; ' ;
  if first.name then put '  if name =' name $quote. 'then output ' name ';' ;
  if eof then put 'run;' ;
run;

最后运行生成的代码。

%include code / source2 ;