【问题标题】:Drop a variable from a SAS dataset based on a condition (IF THEN DO)根据条件从 SAS 数据集中删除变量(IF THEN DO)
【发布时间】:2018-01-18 09:18:35
【问题描述】:

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

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

男性

姓名年龄体重身高

女性

姓名体重身高

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

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

我对 SAS 还很陌生,因此我们将不胜感激!

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    当您在 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;
    

    【讨论】:

    • 感谢您的回复! 'call missing(age)' 方法在从数据集中省略年龄观察时效果很好。但是,我真正想做的是完全删除变量。所以假设有 19 个名称,因此一旦原始数据集被拆分,就会有 19 个新数据集。如果此人是女性,则应从每个女性数据集中删除年龄变量。有没有办法可以做到这一点?
    • 通常在 SAS 中应该始终避免像那样拆分数据集。使用单个大数据集和适当的by 语句要容易得多。
    • 也就是说,我更新了我的答案以包含一个示例,说明如何在一个输出数据集中而不是另一个输出数据集中删除一列。
    【解决方案2】:

    不能有条件地运行 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 ;
    

    【讨论】:

    • 似乎是一种相当复杂/迂回的做事方式。事后简单地从生成的表中删除列而不是遇到这个麻烦不是更容易吗?还是使用宏?或者更好地使用 user667 的方法?
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    相关资源
    最近更新 更多