Loops SAS使用带do循环的迭代变量

Loops SAS使用带do循环的迭代变量,loops,sas,do-loops,Loops,Sas,Do Loops,我有一个样本数据集,我正试图用do循环从每个观察(记录)创建一个新的数据集 以下是示例代码: data tst; input a b; datalines; 1 2 2 3 ; run; data ds1 ds2; set tst /*point = point nobs = Nobs*/ ; do i=1 to 2; call symput("i",i); %put &=i; if _n_ then output ds&i.; end; run;

我有一个样本数据集,我正试图用do循环从每个观察(记录)创建一个新的数据集

以下是示例代码:

data tst;
input a b;
datalines;
1 2
2 3
;
run;

data ds1 ds2;
set tst 
/*point = point nobs = Nobs*/
;
do i=1 to 2;
    call symput("i",i);
    %put &=i;
    if _n_ then output ds&i.;
end;
run;
我不明白为什么
&I.
解析不正确。看起来日志中有很多空间。我尝试在
ds&I.
上使用compress函数,但不起作用。我知道我可以使用宏,不用调用symput(),但我想知道这有什么问题

理想输出:

DS1:
ab
1 2

DS2:
ab

2 3这是一种已知的行为。电话会议手册摘录:

在可用之前尝试引用指定的SYMPUT值时出现问题

使用SYMPUT最常见的问题之一是,在创建宏变量之前,尝试引用SYMPUT指定的宏变量值。失败通常是因为引用宏变量的语句在执行分配变量值的CALL SYMPUT语句之前编译。使用SYMPUT时要记住的最重要的事实是,它在程序执行期间分配宏变量的值。宏变量引用在编译步骤、步骤外部使用的全局语句或SCL程序期间解析。因此:

在SYMPUT创建宏变量并为其赋值的同一程序(或步骤)中,不能使用宏变量引用检索宏变量的值


在引用程序后面的全局语句(例如,标题语句)中的值之前,必须指定步骤边界语句以强制执行数据步骤。边界可以是RUN语句或其他DATA或PROC语句。

这是一种已知行为。电话会议手册摘录:

在可用之前尝试引用指定的SYMPUT值时出现问题

使用SYMPUT最常见的问题之一是,在创建宏变量之前,尝试引用SYMPUT指定的宏变量值。失败通常是因为引用宏变量的语句在执行分配变量值的CALL SYMPUT语句之前编译。使用SYMPUT时要记住的最重要的事实是,它在程序执行期间分配宏变量的值。宏变量引用在编译步骤、步骤外部使用的全局语句或SCL程序期间解析。因此:

在SYMPUT创建宏变量并为其赋值的同一程序(或步骤)中,不能使用宏变量引用检索宏变量的值


在引用程序后面的全局语句(例如,标题语句)中的值之前,必须指定步骤边界语句以强制执行数据步骤。边界可以是一个RUN语句或另一个DATA或PROC语句。

这是由于宏变量无法在初始化它的数据步骤中使用。所以我认为您应该使用宏(和fixeif语句,在我认为应该使用的示例中):

数据集tst:

+---+---+
| a | b |
+---+---+
| 1 | 2 |
| 2 | 3 |
+---+---+
数据集ds1:

+---+---+
| a | b |
+---+---+
| 1 | 2 |
+---+---+
数据集ds2:

+---+---+
| a | b |
+---+---+
| 2 | 3 |
+---+---+

这是因为宏变量无法在初始化它的数据步骤中使用。所以我认为您应该使用宏(和fixeif语句,在我认为应该使用的示例中):

数据集tst:

+---+---+
| a | b |
+---+---+
| 1 | 2 |
| 2 | 3 |
+---+---+
数据集ds1:

+---+---+
| a | b |
+---+---+
| 1 | 2 |
+---+---+
数据集ds2:

+---+---+
| a | b |
+---+---+
| 2 | 3 |
+---+---+
使用SYMGET()在同一数据步骤中使用变量。此已更新。请使用SYMGET()在同一数据步骤中使用该变量。这已经更新。或者查看这篇文章,再添加两个到解决方法的链接:或者查看这篇文章,再添加两个到解决方法的链接: