如何在SAS中的哈希表中使用%let宏

问题描述

我正在更新使用哈希表的程序。该程序有很多重复的变量,这些变量会定期更改。 我一直在更新它们,以引用包含这些变量的宏代码的程序,因此我们不必一一更改它们,并且在所有其他项目中它的作用一直很吸引人,但我一直在努力解决这些哈希问题桌子 例如

%let year = x2020;
data acute &year.;
  if 0 then set a_&syear.;
  if _n_=1 then do;
    declare has Tx(dataset:"Ty");
    Tx.defineData("city","&year.");
    Tx.define();
    call missing(city,&year.);
  end;
....
run;

我将其范围缩小到&year的使用。在Tx.defineData行中。 似乎没有在引号中选择宏,并且收到此错误

未声明的数据符号&year。对于有对象

尽管我通常对引号内的宏没有问题。 我尝试将let函数更改为%let year = "x2020";并在不需要引号的区域中使用dequote(),也尝试使用quote(&year.)而不是获取

未声明的数据符号“。用于哈希对象...。

在这种情况下,有没有人找到一种使用let宏的方法

解决方法

您的主要问题是,

您正在尝试使用以数字开头的数据集和字段的名称。 SAS中的名称应以字母或下划线开头,并且只能包含字母,下划线和数字。如果没有,应该用不同的方式写。

  • 编写"name with blanks"n以创建名为name with blanks的变量或数据集
  • 编写"1_2_3"n以创建名为name with blanks的变量或数据集

现在可以,但是我建议您不要这样做,因为语法变得非常复杂。

您的代码不完整,包含很多错字。

因此,我不得不猜测您实际上想做什么。 如果您为我们剪切并粘贴日志,或者最好剪切并粘贴日志,这将有所帮助,以便我们确切地知道您的工作。

数据步骤

我假设使用data acute &year.;,您只想创建一个名为acute 2020的数据集。如果是这样,您应该写data "acute &year."n;,但实际上我建议您重命名数据集并写data acute_&year.;

您可能还想在一个数据步骤中创建数据集acute2020。那你应该写data acute "&year"n.;

哈希表的声明

首先,它不是declare has,而是declare hash,而不是Tx.define();,而是Tx.defineDONE();

如果使用Tx.defineData("city","&year.");指定字段city2020用作数据,那应该起作用,因为在这里您将变量名指定为字符串,而不是SAS名称

错误实际上在call missing(city,&year.);中,在这里您应该使用特殊语法call missing(city,"&year."n);

同样,我建议您将变量重命名为_2020,这样您就可以将其写为_&year.