0

在这段 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;

感谢您推荐数组 :)

4

1 回答 1

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 = 数组中的元素数量)。

于 2012-11-15T21:36:05.573 回答