【问题标题】:Use SAS Proc SQL to Find Rows Where All Columns Are Not Missing?使用 SAS Proc SQL 查找所有列都没有丢失的行?
【发布时间】:2016-08-11 18:39:47
【问题描述】:

我想使用 SAS Proc SQL 在表中找到我的行,其中每一列都有一个非缺失值。有没有办法做到这一点而不必列出所有的列名?这不起作用,但它可能会让您了解我的预期输出是什么。

Proc SQL;
    Select *
    from work.table
    Where * is not null;
Run;

如果可能,我还想将结果限制为一项观察。谢谢。

【问题讨论】:

    标签: sql sas


    【解决方案1】:

    在 SQL 中很重要,因为如果不使用宏语言,您无法在一项中获取所有变量。在数据步中,这是微不足道的。

    data class;
      set sashelp.class;
      if mod(_n_,3)=1 then call missing(age);
    run;
    
    data want;
      set class;
      if cmiss(of _all_)=0;
    run;
    

    cmiss 如果缺少字符或数字变量,则表示 1(特别是在这种情况下计算缺失的总数)。您可以使用数据步骤上的obs=1 选项将其限制为一个。

    【讨论】:

    • 这成功了!谢谢你。对于将来可能想要使用 Joe 的代码的任何人的记录,只需将 if cmiss(of all) 更改为 1 而不是 0 即可获得包含所有非缺失值的行。
    • 为什么要改成1?那么这意味着您要查找缺少 one 值的行。所有非缺失都是 0。
    • 你是对的。最初 cmiss = 0 确实没有返回任何结果,但我现在意识到这是因为原始表中有一个列,其中每一行都有一个缺失值。当我删除该列时,是的 cmiss=0 是正确的。谢谢。
    【解决方案2】:

    在 SQL 中,您必须是明确的。 * 不是扩展列的通用宏。它是一个语法元素,恰好在select *count(*) 中使用。

    所以,是这样的:

    Proc SQL;
        Select *
        from work.table
        Where col1 is not null and col2 is not null and col3 is not null . . .
    Run;
    

    【讨论】:

      【解决方案3】:

      使用 SQL 和字典表:

      proc sql noprint;
          select cats('not missing(', name, ')')
          into :expression separated by " and "
          from dictionary.columns
          where libname = "SASHELP" and memname = "CLASS";
      quit;
      
      proc sql outobs=1;  
          select *
          from sashelp.class
          where &expression.;
      quit;
      

      【讨论】:

        猜你喜欢
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 2020-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多