我有一个数据,其字段为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;
答案 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