用于创建具有可变边界的可变数量的存储桶的宏

问题描述 投票:0回答:1

我对 SAS 比较陌生,所以我可能会忽略我不知道的 SAS 基本功能。

我有一个带有数值变量“A”的大型数据集。我想编写一个宏,允许我基于数组创建存储桶,但数组的长度和值可以更改。

示例 1:我的数组为 {1, 2, 6, 10},在这种情况下,所有观测值为 A 小于 1 的应该在桶 1 中, 存储桶 2 中介于 1 和 2 之间的值, 存储桶 3 中 2 到 6 之间的值以及 桶 4 中 6 到 10 之间的值

示例 2:我的数组为 {3, 10},在这种情况下,所有观测值为 A 小于 3 的应该在桶 1 中并且 桶 2 中 3 到 10 之间的值

理想情况下,我希望数组成为宏的输入变量。或者,如果这是不可能的,我只需要更改宏中的硬编码数组。

谢谢您的帮助。

作为新手,我还没有尝试过任何东西。

sas sas-macro
1个回答
0
投票

使用“数组”来解决此问题的一种方法是在数据步骤中创建一个临时数组,并将值初始化为值列表。 然后只需查看数组,直到查找的值大于列表中的当前项。

让我们在 SASHELP.CLASS 中的数据上尝试一下,并将 AGE 分成 3 个桶,如下所示:

data class;
  set sashelp.class;
  array list [2] _temporary_ (12 15);
  do bucket=1 to dim(list) until(age <= list[bucket]); 
    * do nothing ;
  end;
run;

让我们看看效果如何:

proc freq data=class;
  tables bucket*age / list ;
run;

结果

The FREQ Procedure

                                          Cumulative    Cumulative
bucket    Age    Frequency     Percent     Frequency      Percent
------------------------------------------------------------------
     1     11           2       10.53             2        10.53
     1     12           5       26.32             7        36.84
     2     13           3       15.79            10        52.63
     2     14           4       21.05            14        73.68
     2     15           4       21.05            18        94.74
     3     16           1        5.26            19       100.00
© www.soinside.com 2019 - 2024. All rights reserved.