SAS:使用通话交集宏变量作为过滤条件

时间:2018-08-16 06:44:09

标签: sas

我有一个数据,其字段为Income,Age和Cond,其中A和B为数字,并且Cond包含条件(字符串),例如“ If Income> = 10000”,“ If Age <= 35”等。 我想使用字段Cond过滤数据。 我正在使用调用symput在数据步骤bt中创建运行时宏变量,无法将其用作过滤条件。

data T2;
    set T1;
    CALL SYMPUT("Condition", Cond);
    &Condition.; /*this is the line which is not working*/
run;

2 个答案:

答案 0 :(得分:0)

美好的一天

我假设您表中只有一个条件? (每行相同的原因。)除非,您需要通过其他原因选择正确的原因。这就是最后一行的原因。

Firtst让我们生成一些虚拟数据。

Manager

我们在这里所做的是创建全局变量和条件,并将Cond列的最后一个值放入其中。您还可以使用 proc sql 轻松地在变量中选择所需的字符串。 See more on proc sql Into here

    data T1; 
        infile datalines delimiter=','; 
        input cond $21. Income  age  ;  
        cards;
        "If Income>=10000" , 1000 , 10
        "If Income>=10000" , 10000 , 100 
        "If Income>=10000" , 100000 , 1000
    ;run;

在这里,我们从集合T1开始,并应用 String 和条件,其中包含规则。我需要从命令中删除引号,以使SAS执行该功能。以这种方式应用命令有点不合常规,但是可行。

    data _NULL_;
        set T1;
        CALL SYMPUT("Condition", Cond);
    run;

编辑:根据进一步的详细说明,以下内容已经过测试。一个将条件馈送到宏循环,该宏循环选择条件。如果有dupilates,我建议您将条件和数据分成不同的集合。

    data T2; 
        set T1; 
        %qsysfunc(dequote(&Condition.)); 
    run;

答案 1 :(得分:0)

您正在混合示波器。

正在运行的数据步骤无法更改其正在运行的源代码,因此您不能让一个数据步骤设置宏变量值,然后期望该数据集将宏变量的分辨率用作源代码。

您可以使用多种技术来评估表达式。

调用执行

在DATA步骤运行时,可以在宏环境中使用call EXECUTE%EVAL表达式。可以使用SYMGET

检索结果

想法示例

  %let x = 0;

  data _null_;

    length expression $1000;

    expression = '%let x = %eval(10 + 20)';
    call execute (expression);

    x = symget('x');
    put x=;
  run;

使用创意

  data want;
    set have;

    condition = tranwrd(condition, 'age', cats(age));
    condition = tranwrd(condition, 'income', cats(income));

    call execute (cats('%let result = %eval(', condition, ')'));

    result = symget('result');

    * subsetting if based on dynamic evaluation of conditional expression;
    if result;
  run;

其他

执行动态代码的其他方式是通过功能 RESOLVE DOSUBL