首页 > 解决方案 > 在 sas 循环中循环变量时遇到问题

问题描述

非常简单:我正在尝试将许多字符变量转换为数字。以下代码给出了“语法错误,期待以下内容:名称、-、:、;” 对于删除和重命名行。

data ex; set ex;
    array numeric{3} var1 var2 var3;
    do i=1 to 8;
        temp = input(strip(numeric(i)),10.);
        drop numeric(i);
        rename temp = numeric(i);
    end;
run;

你不能在 do 循环中使用 drop 或 rename 语句吗?

标签: arrayssas

解决方案


数据集结构必须在编译数据步骤时确定。因此,您无法在重命名语句中使用数组引用。

如果你真的有简单的数字后缀变量名,那么你可以使用一个简单的 RENAME 语句。

rename new1-new3=var1-var3;

所以你的程序可能就这么简单:

data want;
  set have;
  array ch var1-var3;
  array new new1-new3;
  do index=1 to dim(ch);
    new[index]=input(left(ch[index]),32.);
  end;
  drop index var1-var3;
  rename new1-new3=var1-var3;
run;

如果名称列表更复杂,例如 AGE HEIGHT WEIGHT,那么您将需要使用更复杂的 RENAME 语句,例如:

rename new1=AGE new2=HEIGHT new3=WEIGHT ;

所以使用某种类型的代码生成方法。像宏代码或使用数据步骤将代码行写入文件,该文件可以包含在程序中的 using%include语句中。

例如,您可以制作这样的宏:

%macro rename(varlist);
%local i;
rename
%do i=1 %to %sysfunc(countw(&varlist));
   new&i=%scan(&varlist,&i)
%end;
;
%mend ;

并像这样使用它:

%let charvars=AGE HEIGHT WEIGHT;

data want;
  set have;
  array ch &charvars;
  array new [%sysfunc(countw(&charvars))];
  do index=1 to dim(ch);
    new[index]=input(left(ch[index]),32.);
  end;
  drop index &charvars;
  %rename(&charvars);
run;

推荐阅读