【问题标题】:SAS check if value is in dynamic list of variablesSAS检查值是否在变量的动态列表中
【发布时间】:2021-06-15 03:27:47
【问题描述】:

我想检查一个字符变量是否存在于其他 9 个字符变量中,但是我很难编写一段代码,该代码可以为我的数据集中的每个观察值自动生成一个变量列表。这是我拥有的数据集的一个示例:

| ID | MainVar | Var1   | Var2 | Var3   | Var4 | Var5 | Var6| Var7 | Var8 | Var9 |
| 1  | Apple   | Orange | Pear |        |      |      |     |      |      |      |
| 2  | Pear    | Apple  | Pear | Orange |      |      |     |      |      |      |

我想为 ID 1 输出一个标志或类似的东西,它在 Var1-9 中不存在 MainVar。所以看起来像这样:

| ID | MainVar | Var1   | Var2 | Var3   | Var4 | Var5 | Var6| Var7 | Var8 | Var9 | Err_msg    |
| 1  | Apple   | Orange | Pear |        |      |      |     |      |      |      | Check list |
| 2  | Pear    | Apple  | Pear | Orange |      |      |     |      |      |      |            |

我的代码如下所示:

Data Want; 
    set have; 

    if MainVar not in (Var1, Var2, Var3, Var4, Var5, Var6, Var7, Var8, Var9) then Err_msg = 'Check list';
run;

SAS 产生以下错误:

ERROR 22-322: Syntax error, expecting one of the following: a quoted string, a numeric constant, a datetime constant, 
              a missing value, iterator, (.

我假设我需要生成一个带引号的字符串的实际列表,即使所有 VAR1-9 变量确实是字符串。有没有人可以轻松解决这个问题?

【问题讨论】:

    标签: list sas


    【解决方案1】:

    方法是将所有var 变量连接成一个字符串,并使用index

      length allvars $1000. ; 
      allvars = catx('|', of Var:) ; 
      if index(allvars,strip(MainVar)) = 0 then ErrMsg = 'Check list' ;
    

    【讨论】:

    • 我想这会起作用,所以感谢您的输入。在看到您的回复之前,我自己设法找到了解决方案。
    【解决方案2】:

    我自己想出了一个解决方案。

    Data want;
         set have; 
    
         array list Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9;
         if MainVar not in list then Err_Msg = 'Check list';
    
    run;
    

    看起来很简单,效果也很好。

    【讨论】:

      【解决方案3】:

      只需使用 WHICHx 函数即可。如果 MAINVAR 和 VAR1-VAR9 是字符使用 WHICHC(),如果它们是数字使用 WHICHN。这也将允许您使用变量列表。

      data want;
       set have; 
       if not whichc(mainvar, of var1-var9) then Err_Msg = 'Check list';
      run;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 2012-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多