sas - 在 WHEN-DO 语句 SAS 中创建一个变量
问题描述
想要根据 prod 的值创建 2 个宏变量“list”和“list2”,但它总是返回最后一次迭代值。
谢谢
%let prod=WC;
SELECT ;
WHEN (WC = &prod)
DO;
%let list = (60 , 63 );
%let list2= ("6A","6B","6C") ;
END;
WHEN (MT = &prod)
DO;
%let list = (33 , 34);
%let list2= ("3A","3B");
END;
OTHERWISE;
END;
RUN;
``
解决方案
宏处理器在生成的代码传递给 SAS 进行解释之前工作。因此,您的代码按以下顺序评估:
%let prod=WC;
%let list = (60 , 63 );
%let list2= ("6A","6B","6C") ;
%let list = (33 , 34);
%let list2= ("3A","3B");
data ...
SELECT ;
WHEN (WC = &prod) DO;
END;
WHEN (MT = &prod) DO;
END;
OTHERWISE;
END;
...
RUN;
要从正在运行的数据步骤设置宏变量,请使用 CALL SYMPUTX() 函数。另外,您是否真的想将变量 WC 与变量 MT 进行比较?您的数据步骤中的数据是否甚至具有这些变量?还是您想将文本 WC 与文本 MT 进行比较?
when ("WC" = "&prod") do;
call symputx('list','(60,63)');
call symputx('list2','("6A","6B","6C")') ;
end;
推荐阅读
- android - 参数‘firebaseFirestore’因其类型不能有‘null’的值,但flutter中隐含的默认值为‘null’
- python - 如何为 softmax 编写 JAX 自定义向量-雅可比积 (vjp)
- minecraft - Minecraft 改装 - 带面料
- android - 使用渐变颜色反应原生 ActivityIndicator
- c# - 在 C# 类方法中发送网格
- java - 如何在 Hibernate 中覆盖 @SequenceGenerator
- rust - 如何使用 actix-web 的 Form 类型解决“serde::Deserialize 的实现不够通用”?
- powershell - nuget.exe 的本地副本无法在 nuget.org 上找到任何包
- apache-spark - 如果 Spark 评估器仅返回 1 个值,为什么它具有 avgMetrics 属性?
- iis - 通过证书连接时如何防止使用“LocalSystem”应用程序池标识