所以我已经在网上搜索了一些,但没有设法找到任何可以解决这个问题的东西。从本质上讲,我已经获得了一个数据集,然后我根据名称将其拆分为单个数据集。
但是,如果此人是女性,则需要从数据集中省略年龄。示例输出:
男性
名称年龄体重高度
女性
名称重量高度
我尝试过以下IF语句,但它似乎从男性和女性表中删除了年龄变量:
if sex="F" then do;
drop age;
end;
我对SAS很新,所以非常感谢任何帮助!
答案 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 ;