Loops SAS使用带do循环的迭代变量
我有一个样本数据集,我正试图用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;
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()在同一数据步骤中使用该变量。这已经更新。或者查看这篇文章,再添加两个到解决方法的链接:或者查看这篇文章,再添加两个到解决方法的链接: