SAS:数组和宏变量

SAS:数组和宏变量,sas,Sas,我想使用do循环创建一个数据集,其中包含列y1中的宏变量p1和列y2中的宏变量p2 你能帮我吗 我尝试了以下方法: %let p1 = 1; %let p2 = 2; 这将导致以下错误: data test; array y(2); do i = 1 to 2; y(i) = &&p&i; end; run; 您的i是一个数据集变量(不是宏变量),因此不能被&i引用 您可以将do循环更改为宏%do循环(并在宏中换行),因为这将创

我想使用do循环创建一个数据集,其中包含列
y1
中的宏变量
p1
和列
y2
中的宏变量
p2

你能帮我吗

我尝试了以下方法:

%let p1 = 1;
%let p2 = 2;
这将导致以下错误:

data test;
    array y(2);
    do i = 1 to 2;
        y(i) = &&p&i;
    end;
run;

您的
i
是一个数据集变量(不是宏变量),因此不能被
&i
引用

您可以将
do
循环更改为宏
%do
循环(并在宏中换行),因为这将创建宏变量,或者使用以字符串形式基于宏变量的名称获取宏变量值

宏观方法:

Syntax error, expecting one of the following: a name, a quoted string,
              a numeric constant, a datetime constant, a missing value, INPUT, PUT.
%macro t;
data test;
    %do i = 1 %to 2;
        y&i = &&p&i;
    %end;
run;
%mend t;
%t;
symget
方法:

Syntax error, expecting one of the following: a name, a quoted string,
              a numeric constant, a datetime constant, a missing value, INPUT, PUT.
%macro t;
data test;
    %do i = 1 %to 2;
        y&i = &&p&i;
    %end;
run;
%mend t;
%t;
因为宏实际上正在创建语句
y#=#在执行数据步骤之前,数组有点冗余(除非它将引用具有其他名称的变量)。我在第二个示例中添加了一个
drop
语句,它只是从输出数据集中删除变量
I


编辑:类型讨论

宏变量没有类型,它们包含文本。SAS对宏变量的处理是相同的,无论您在其中存储了什么
%let a=1
%设a=Cats都在存储文本

通常,宏变量用于在SAS程序执行之前将存储在宏变量中的文本替换为SAS程序。在上面的第一个示例中,SAS在执行数据步骤之前评估宏语句并解析宏变量,它变为:

data test;
    array y(2);
    do i = 1 to 2;
        y(i) = symget("p" || put(i, 1.));
    end;
    drop i;
run;
通过这种方式使用宏语言,当您需要手动输入内容时,可以自动编写基础SAS程序中繁琐或重复的部分。考虑到这一点,考虑要从宏变量传递字符串到DataSet变量的情况。

data test;
    y1 = 1;
    y2 = 2;
run;
上面的代码会抱怨没有变量名为
canada
,因为它会尝试解析
y1=canada
。但是,如果您将其中一项(但不是全部)作业用引号括起来,它将按预期工作:
y&i=“&&p&i”(或
%let p1=“加拿大”

symget()

data test;
    y1 = 1;
    y2 = 2;
run;


一般来说,宏变量不是存储/移动数据的好方法,如果您的值改变了程序的工作方式,则宏变量有助于对脚本进行参数化,但如果您移动大量数据,则可能有更好的方法可用。正如Joe在上面指出的,可能有更好的方法来解决你的问题

您的
i
是一个数据集变量(不是宏变量),因此不能被
&i
引用

您可以将
do
循环更改为宏
%do
循环(并在宏中换行),因为这将创建宏变量,或者使用以字符串形式基于宏变量的名称获取宏变量值

宏观方法:

Syntax error, expecting one of the following: a name, a quoted string,
              a numeric constant, a datetime constant, a missing value, INPUT, PUT.
%macro t;
data test;
    %do i = 1 %to 2;
        y&i = &&p&i;
    %end;
run;
%mend t;
%t;
symget
方法:

Syntax error, expecting one of the following: a name, a quoted string,
              a numeric constant, a datetime constant, a missing value, INPUT, PUT.
%macro t;
data test;
    %do i = 1 %to 2;
        y&i = &&p&i;
    %end;
run;
%mend t;
%t;
因为宏实际上正在创建语句
y#=#在执行数据步骤之前,数组有点冗余(除非它将引用具有其他名称的变量)。我在第二个示例中添加了一个
drop
语句,它只是从输出数据集中删除变量
I


编辑:类型讨论

宏变量没有类型,它们包含文本。SAS处理宏变量的方式相同,无论存储在宏变量中的内容
%let a=1
%设a=Cats都在存储文本

通常,宏变量用于在SAS程序执行之前将存储在宏变量中的文本替换为SAS程序。在上面的第一个示例中,SAS在执行数据步骤之前评估宏语句并解析宏变量,它变为:

data test;
    array y(2);
    do i = 1 to 2;
        y(i) = symget("p" || put(i, 1.));
    end;
    drop i;
run;
通过这种方式使用宏语言,当您需要手动输入内容时,可以自动编写基础SAS程序中繁琐或重复的部分。考虑到这一点,考虑要从宏变量传递字符串到DataSet变量的情况。

data test;
    y1 = 1;
    y2 = 2;
run;
上面的代码会抱怨没有变量名为
canada
,因为它会尝试解析
y1=canada
。但是,如果您将其中一项(但不是全部)作业用引号括起来,它将按预期工作:
y&i=“&&p&i”(或
%let p1=“加拿大”

symget()

data test;
    y1 = 1;
    y2 = 2;
run;


一般来说,宏变量不是存储/移动数据的好方法,如果您的值改变了程序的工作方式,则宏变量有助于对脚本进行参数化,但如果您移动大量数据,则可能有更好的方法可用。正如Joe在上面指出的,可能有更好的方法来解决你的问题

你为什么这么做?看起来您的问题完全可以不用使用这样的宏变量来解决。您是否将数据存储在宏变量中?为什么要这样做?看起来您的问题完全可以不用使用这样的宏变量来解决。是否将数据存储在宏变量中?如果宏变量值是字符,即&p&i解析为加拿大,该怎么办?宏变量都是文本,没有宏变量类型的概念。如果要将宏变量的内容放入字符数据集变量,请将其用双引号括起来:
dsVar=“&mVar.”
symget
返回字符串。抱歉,Reeza,我假设您的评论是OP中的一个问题。我在底部添加了一些类型。如果宏变量值是字符,即&p&I解析为Canada,该怎么办?宏变量是