【问题标题】:rename the variables in an array with names from another array用另一个数组中的名称重命名数组中的变量
【发布时间】:2017-10-06 12:10:32
【问题描述】:

我正在尝试按照以下方式重命名基于一个数组元素的变量,

%let var= class name gender;

data want; 
set have;

%global noof; 

array point(*)$   %str(&var)  ;
a=dim(point);
call symputx('noof',a);


array newvar(&noof);


do i=1 to &noof;

newvar(i)=translate(point(i),',','.');

end; 

drop &var; 

do i=1 to &noof;

rename newvar(i)=vname(point(i));

end; 

运行;

我想将新变量重命名为第一个数组元素。

日志:

 rename newvar(i)=vname(point(i));
                  -
                  22
                  76
ERROR 22-322: Syntax error, expecting one of the following: -, :, =.

ERROR 76-322: Syntax error, statement will be ignored.

【问题讨论】:

  • 您不能在 RENAME 语句中使用函数。在开始使用宏变量或宏代码生成 SAS 代码之前,写出您要生成的 SAS 代码。向我们展示您尝试生成的 SAS 代码。
  • 我认为标题正是他想要的 - 他想用另一个数组的名称重命名数组中的变量。数据步骤中的代码对于问题来说是多余的。
  • @DomPazz 你是对的。我想我会改变这个问题。
  • 对我在 sascommunities 网站上的新增强请求进行投票。 communities.sas.com/t5/SASware-Ballot-Ideas/…

标签: macros sas


【解决方案1】:

不幸的是,RENAME 语句的 RHS 上的值必须是文字。该语句在编译时评估,而不是在运行时评估。

试试这个:

%let var= class name gender;

%macro translate(datain,dataout,vars);
%local n i var;
%let n=%sysfunc(countw(&vars));


data &dataout(rename=(
    %do i=1 %to &n;
        %let var = %scan(&vars,&i);
        newvar&i = &var
    %end;
)); 
set &datain;

array invars(&n) $  &vars  ;

array newvar(&n) $;


do i=1 to &n;
    newvar(i)=translate(invars(i),',','.');
end; 

drop &vars i; 

run;
%mend;

data test;
class = "1,2,3";
name= "Dom,Pazzula";
gender="M";
run;

%translate(test,out,&var);

如果这些字符变量的长度太大,您可能会遇到问题。新变量可能会被截断。您必须对其进行修改以添加 length 语句。

【讨论】:

  • 这行得通,我理解,在输出数据集级别重命名。
  • 这篇文章中的语法之所以有效,是因为它会生成要重命名的 old=new 变量对的完整列表。这将适用于常规 RENAME 语句或在输出数据集上使用 RENAME= dataset 选项。
猜你喜欢
  • 2021-10-22
  • 2017-10-10
  • 1970-01-01
  • 2012-06-13
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多