我正在尝试为数字变量构建垃圾箱。 当我不使用%macro时,一切工作正常,因此我认为它是特定于宏的。基本上这部分代码:
try-catch
无法正常工作。下面,我简化为一个迭代和一个变量,但是我的实际代码还有更多-但是问题是相同的。
完整代码:
%if first.&rank_column. = 1 %then %do;
因此循环无法识别%if部分中的参数。
感谢帮助!
[编辑]:
为了澄清,我想做的步骤是:
用于列表&var_list中的变量。
为此建立排名
按该变量排序
使用数据的步骤:按等级分组
使用first来查找对应于组开始的变量的值。并使用last结束群组。其余都留空
一些后续步骤...
所以基本上我想创建乞求和排名间隔结束。
我是图片中的例子;第一排第一。 = 1,因此Start_bin应为$ 10.280,而End_bin应为空。下一行应该为空,因为两者都在前。最后。是0。
答案 0 :(得分:1)
所以您的基本问题是使用宏逻辑,而应该使用普通逻辑。
%if first.&rank_column. = 1 %then %do;
即使rank_column
为空,也永远不会为真,因为字符串first.
永远不会等于字符串1
。
但是,如果您使用SAS代码而不是宏代码进行编码
if first.&rank_column. = 1 then do;
那么当您第一次观察由宏变量rank_column
的值命名的那个变量的特定值时,将为真。
您可能会在整体逻辑上遇到更大的问题,因为您将覆盖同一数据集中的相同变量名start_bin
和end_bin
。因此,宏完成后,只有列表中最后一个变量生成的bin的值才可用。
答案 1 :(得分:1)
如果最终要寻找的组边界是group = 10,那是否不等于通过proc摘要或proc手段找到百分位数?通过百分位数方法进行操作的好处还意味着您可以一次处理多个变量。我在这里没有设置任何平局选项,但是我相信也可以设置。
description