Arrays SAS在操作后将某些行作为新变量名

Arrays SAS在操作后将某些行作为新变量名,arrays,sas,Arrays,Sas,使用GETNAMES=NO导入CSV数据后,我有59列变量名为VAR1、VAR2、。VAR59。我的第一行包含新变量所需的名称,但它们首先需要通过删除特殊字符并将空格转换为下划线来进行操作,因为SAS不喜欢变量名称中的空格。这是我在那件作品中使用的阵列: DATA DATA1; SET DATA (FIRSTOBS=7); ARRAY VAR(59) VAR1-VAR59; IF _N_ = 1 THEN DO; DO I = 1 TO 59; VAR[I] = COMPRESS(TRA

使用
GETNAMES=NO
导入CSV数据后,我有59列变量名为VAR1、VAR2、。VAR59。我的第一行包含新变量所需的名称,但它们首先需要通过删除特殊字符并将空格转换为下划线来进行操作,因为SAS不喜欢变量名称中的空格。这是我在那件作品中使用的阵列:

DATA DATA1; SET DATA (FIRSTOBS=7);
ARRAY VAR(59) VAR1-VAR59;
IF _N_ = 1 THEN DO;
DO I = 1 TO 59;
    VAR[I] = COMPRESS(TRANSLATE(TRIM(VAR[I]),'_',' '),'?()');
    PUT VAR[I]=;
    END;
END;
DROP I;
RUN;
这非常有效,但现在我需要将第一行添加到新变量名。我尝试了一个类似的数组来执行此操作:

DATA DATA2; SET DATA1;
ARRAY V(59) VAR1-VAR59;
DO I = 1 TO 59;
    IF _N_ = 1 AND V[I] NE "" THEN CALL SYMPUT("NEWNAME",V[I]);
    RENAME VAR[I] = &NEWNAME;
    END;
    DROP I;
RUN;

由于没有连接到
&NEWNAME
[i]
,因此这只放置了VAR59的名称,而且它仍然不能正常工作。有没有建议在操作后将行上移到变量名?

您的主要问题是,您试图在创建宏变量的数据步骤中使用宏变量。你不能。您还试图在数据步骤中创建重命名语句<与其他类似语句(
keep
drop
)一样,必须在编译数据步骤之前定义code>rename

您需要用这些信息在某个地方编写代码——文本文件、宏变量,等等。例如:

filename renamef temp;
data _null_;
  set myfile (obs=1);
  file renamef;
  array var[59];
  do _i = 1 to dim(Var);
    [your code to clean it out];
    strput = cat("rename",vname(var[_i]),'=',var[_i],';');
    put strput;
  end;
run;
data want;
  set myfile (firstobs=2);
  %include renamef;
run;
在网站和网络上还有很多其他的例子,“列表处理”就是这个术语。

乔——根据你的建议和你的另一篇文章,以下内容完美无瑕:

将所需变量的行放入长格式(在我的例子中,第一行是n=1)

创建重命名宏调用的列表

PROC SQL;
    SELECT CATS('%RENAME(VAR=',_NAME_,',NEWVAR=',COL1,')')
    INTO :RENAMELIST SEPARATED BY ' '
    FROM NEWVARS1;
QUIT;

%MACRO RENAME(VAR=,NEWVAR=);
    RENAME &VAR.=&NEWVAR.;
%MEND RENAME;
调用在步骤2中创建的列表以重命名所有变量

PROC DATASETS LIB=WORK NOLIST;
    MODIFY DATA;
    &RENAMELIST.;
QUIT;

我必须执行一些额外的检查,确保变量名不超过32个字符,并且当数据在转置后是长格式时,这很容易检查。如果某些单词的长度太长,则
TRANWRD
语句可以很容易地将其替换为缩写

SAS会很高兴地按照您描述的方式为您转换这些变量名(我认为它会将特殊字符也转换为下划线,但在其他方面是相同的)。您不想让SAS自动完成这项工作有什么原因吗?或者它不是(例如,您是否在《企业指南》中)?我希望SAS能够自动执行此操作——我想我最初忽略了它,而是直接处理了我希望与我们拥有的其他数据保持一致的行名称。我很欣赏这种洞察力。
PROC DATASETS LIB=WORK NOLIST;
    MODIFY DATA;
    &RENAMELIST.;
QUIT;