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

Hash 如何在SAS中的哈希表中使用%let宏,hash,sas,hashtable,sas-macro,Hash,Sas,Hashtable,Sas Macro,我正在更新一个使用哈希表的程序。程序中有很多重复的变量,这些变量会定期改变。 我一直在更新它们,以引用一个包含这些变量的宏代码的程序,这样我们就不必逐一更改它们,而且它在我所有其他项目中都发挥了巨大的作用,但我正在努力处理这些哈希表 乙二醇 我已经把范围缩小到使用&年。在Tx.defineData行中。 它似乎没有在报价单中拾取宏,并且出现以下错误: 未声明的数据符号和年份。因为他有目标 虽然我通常对引号内的宏没有问题。 我已尝试将let函数更改为%let year=“x2020”和使用dequ

我正在更新一个使用哈希表的程序。程序中有很多重复的变量,这些变量会定期改变。 我一直在更新它们,以引用一个包含这些变量的宏代码的程序,这样我们就不必逐一更改它们,而且它在我所有其他项目中都发挥了巨大的作用,但我正在努力处理这些哈希表 乙二醇

我已经把范围缩小到使用&年。在Tx.defineData行中。 它似乎没有在报价单中拾取宏,并且出现以下错误:

未声明的数据符号和年份。因为他有目标

虽然我通常对引号内的宏没有问题。 我已尝试将let函数更改为
%let year=“x2020”
和使用
dequote()
对于不需要报价的区域,我也尝试使用
quote(&year.)
来代替,但是得到

哈希对象的未声明数据符号“.”

有人想出了在这种情况下使用let宏的方法吗?

您的主要问题是, 您正在尝试使用以数字开头的数据集和字段的名称。SAS中的名称应以字母或下划线开头,并且仅包含字母、下划线和数字。如果没有,则应采用不同的书写方式

  • 写入
    “带空格的名称”n
    以创建名为
    带空格的名称的变量或数据集
  • 编写
    “1_2_3”n
    创建一个名为
    name的变量或数据集,并使用空格
现在可以了,但我建议您不要这样做,因为语法变得非常复杂

你的代码是不完整的,包含了大量的打字错误。 因此,我不得不猜测你到底想做什么。 如果你能帮我们剪切粘贴,或者更好,剪切粘贴原木,这样我们就能确切地知道你做了什么

数据步骤 我假设使用
数据和年份
,您只想创建一个名为
acute2020
的数据集。如果是这样,您应该已经编写了
数据“acute&year.”n
,但实际上我建议您重命名数据集,并每年编写
数据

您可能还希望在一个数据步骤中创建数据集
acute
2020
。那么您应该已经编写了
data-acute“&year”n

哈希表的声明 首先,它不是
declare has
,而是
declare hash
,而不是
Tx.define()
Tx.defineDONE()

如果带有
Tx.defineData(“城市”、“年份”)
您希望指定字段
city
2020
应作为数据使用,这应该是可行的,因为这里您将变量名称指定为字符串,而不是SAS名称

错误实际上出现在
调用缺失(城市和年份)中
这里您应该使用特殊语法
调用missing(city,&year.”n)

同样,我建议您将变量重命名为_2020,这样您就可以将其写成
\u&year。

您的主要问题是, 您正在尝试使用以数字开头的数据集和字段的名称。SAS中的名称应以字母或下划线开头,并且仅包含字母、下划线和数字。如果没有,则应采用不同的书写方式

  • 写入
    “带空格的名称”n
    以创建名为
    带空格的名称的变量或数据集
  • 编写
    “1_2_3”n
    创建一个名为
    name的变量或数据集,并使用空格
现在可以了,但我建议您不要这样做,因为语法变得非常复杂

你的代码是不完整的,包含了大量的打字错误。 因此,我不得不猜测你到底想做什么。 如果你能帮我们剪切粘贴,或者更好,剪切粘贴原木,这样我们就能确切地知道你做了什么

数据步骤 我假设使用
数据和年份
,您只想创建一个名为
acute2020
的数据集。如果是这样,您应该已经编写了
数据“acute&year.”n
,但实际上我建议您重命名数据集,并每年编写
数据

您可能还希望在一个数据步骤中创建数据集
acute
2020
。那么您应该已经编写了
data-acute“&year”n

哈希表的声明 首先,它不是
declare has
,而是
declare hash
,而不是
Tx.define()
Tx.defineDONE()

如果带有
Tx.defineData(“城市”、“年份”)
您希望指定字段
city
2020
应作为数据使用,这应该是可行的,因为这里您将变量名称指定为字符串,而不是SAS名称

错误实际上出现在
调用缺失(城市和年份)中
这里您应该使用特殊语法
调用missing(city,&year.”n)


同样,我建议您重命名变量,例如,将其重命名为_2020,这样您就可以将其写成
\u&year。

对不起,我使用的是安全网络,因此我必须对代码进行分段并手动复制。这个变量实际上不是以数字开头的,我现在将根据您的建议对其进行编辑。这段代码是继承的,但我尝试过调用缺少行(有宏和没有宏),这两种方式都没有问题,但我尝试了你的建议,但仍然不起作用。对不起,我使用的是安全网络,所以我必须对代码进行对位并手动复制。这个变量实际上不是以数字开头的,我现在将根据您的建议对其进行编辑。这段代码是继承的,但我尝试过调用缺少行,不管有没有宏,它都没有问题,但我还是尝试了你的建议,仍然不起作用。
%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;