【问题标题】:Function/ Macro to get a value获取值的函数/宏
【发布时间】:2020-11-09 23:17:37
【问题描述】:

假设我有一个包含 3 个变量的表:var1、var2、var3 和另一个参考表。

现在我想创建另一个变量:var4; var4 是根据 var1、var2 和 var3 以及参考表计算得出的。

我可以创建一个宏来执行此操作(对于每一行),但我不知道如何将宏(表)中的值传递到结果中。我想知道我们如何通过创建一个函数来获取值而不是宏来做到这一点?

我知道如果我可以创建一个这样的函数(这个函数将包括数据步骤和过程摘要),事情会很简单:

var4 = myfunction(var1, var2, var3).

更新:

我的表格参考是:

age range1 range2 range3
1   10     1       8 
2   0      4       1
3   4      6       1
4   6      5       2
5   10     5       6

所以我希望我的函数变成这样:

var4 = myfunction(var1, var2, var3),例如 var1 = 2, var2 = 2, var3 = 5:

取range2之和(对应var1 = 2);从第 2 行到第 5 行(对应于 var2= 2 和 var3 = 5),结果将是:4 + 6 + 5 + 5。

提前致谢。

【问题讨论】:

  • 请详细说明您的“功能”是什么。还有你从另一张桌子上得到什么信息?你的意思是你需要两个表之间的匹配观察来确定在“函数”中使用什么数字?或者该函数是否需要在每次计算中使用来自另一个表的所有信息。函数需要使用多大的表?小到可以放入内存?
  • 您将不得不提供更多详细信息,我怀疑这是执行此任务的效率最低的方法。
  • 可能不需要宏。参考表中有什么(结构和值),它在计算中起什么作用?
  • 我刚刚更新了我的问题,请看一下。
  • 所以听起来你的函数参数更好的名字是:newvar = myfunction(column_number,first_row,last_row)?

标签: function sas sas-macro


【解决方案1】:

一种解决方案可能是首先将参考表修改为长格式,每个年龄每个范围编号一行,并将累积范围放在一个新变量中。然后从 var2 到 var3 的总和成为两个累加值之间的差,这在双连接中更容易计算:

* Define input data with parameters;
data have;
input var1 var2 var3;
datalines;
1 1 3
2 2 5
3 1 4
;
run;

* Define reference table;
data ref_table;
input age range1 range2 range3;
datalines;
1  10  1  8 
2  0   4  1
3  4   6  1
4  6   5  2
5  10  5  6
;
run;

* Modify reference table to long format with accumulated ranges;
data mod_ref_table;
   set ref_table;

   * Calculated accumulated values of each range;
   acc_range1 + range1;
   acc_range2 + range2;
   acc_range3 + range3;

   * Output the accumulated values for each range;
   range_no = 1;
   acc_range = acc_range1;
   output;
   range_no = 2;
   acc_range = acc_range2;
   output;
   range_no = 3;
   acc_range = acc_range3;
   output;
   
   keep age range_no acc_range;
run;

* Calculate output;
proc sql;
   create table want as 
      select a.*
            ,case 
               when a.var2 = 1 then c.acc_range
               else c.acc_range - b.acc_range
            end as val4
      from have as a
      left join mod_ref_table as b
         on a.var1 = b.range_no and a.var2-1 = b.age
      left join mod_ref_table as c
         on a.var1 = c.range_no and a.var3 = c.age 
   ;
quit;

【讨论】:

    【解决方案2】:

    Macro returning a value

    好的,可以在这里找到解决方案。

    无论如何感谢您的支持。

    【讨论】:

    • 这是一个有用但可能相当麻烦的解决方案。如果计算时间是一个问题,那么按照另一个答案中的建议对修改后的参考表进行双重连接可能会更有效,而不是使用函数一遍又一遍地计算总和。如果您的表中有很多行并因此会多次调用您的函数,则尤其如此。
    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2013-04-29
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多