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