SAS:动态设置变量名称

时间:2012-11-15 21:33:07

标签: arrays sas

在这个SAS数据步骤代码块中,我正在从名为TEST_Table的SQL查询中设置一个表。此表包含多个列,包括标题为PREFIX_1到PREFIX_20的较大部分列。每列以PREFIX_开头,然后是从1到20的递增数字。

我想要做的是迭代遍历每一列并分析该列的值。

以下是我想要的例子。正如您所看到的,我想创建一个在每次迭代时增加的变量,然后我将该计数值用作我正在检查的变量名称的一部分。

data TEST_Data;
  set TEST_Table;
  retain changing_number;

  changing_number=1;
  do while(changing_number<=20);    
    if PREFIX_changing_number='BAD_IDENTIFIER' then do;
      PREFIX_changing_number='This is a bad part';
    end;
  end;  

run;

在SAS中如何做到这一点最好?我知道我可以通过简单地从1到20单独检查每个值来实现。

if PREFIX_1 = 'BAD_IDENTIFIER' then do;
  PREFIX_1 = 'This is a bad part';
end;
if PREFIX_2 = ...

但那真是令人讨厌,因为后来我会用一组40多个专栏来做同样的事情。

想法?

data TEST_Data;
    set TEST_Table;

    array SC $ SC1-SC20;

    do i=1 to dim(SC);    
      if SC{i}='xxx' then do;
         SC{i}="bad part";
      end;   
    end;  
run;

感谢您推荐Arrays:)

1 个答案:

答案 0 :(得分:1)

您需要在SAS中查找阵列处理。简单地说,你可以这样做:

data TEST_Data;
  set TEST_Table;
  *retain changing_number; Remove this - even in your code it does nothing useful;
  array prefixes prefix:; *one of a number of ways to do this;
  changing_number=1;
  do while(changing_number<=20);    
    if prefixes[changing_number]='BAD_IDENTIFIER' then do;
       prefixes[changing_number]='This is a bad part';
    end;
  end;  

run;

稍微好一点的循环是:

do changing_number = 1 to dim(prefixes);
... loop ...
end;

由于这一切都在一步,而且数组元素的数量很灵活(dim =数组中元素的数量)。