数组中的SAS变量

时间:2018-06-06 09:53:35

标签: sas

使用数据步骤,我想将变量包含在数组参数中。

为什么呢? 我想声明一个数组,然后用数据填充它(数组所需的长度未知/将来可能会改变)。 我当前的数据集如下:

Row1: "val1=x val2=y val3=xx val4=yy" etc.
Row2: "val1=x"
Row3: "val1=x val2=y"

现在,我想创建列,使用数组进行valX读数。 因此,数据步骤用于计算“val”的出现次数,这给了我一个带有计数数的计数列。

(1)现在我要构建一个表达式:“array {count}”或“array {max(of count)}”;怎么能实现呢?因为数组需要整数输入吗?

(2)另一种选择是创建一个数组{100},然后简单地删除只有缺失值的列,如何实现?

数据步骤示例:

data count;
set input;
counter = count(column,'val','i');
run;
data output;
set count;
array Values{100};
do i = 1 to counter;
Values(i) = scan(column,i+1);
end;
run;

2 个答案:

答案 0 :(得分:2)

创建COUNTER后,您可以找到计数器的最大值并将其读入宏变量,然后使用宏变量来定义数组的大小。

data count;
  input column $50.;
  counter = count(column,'val','i');
  cards;
val1=x val2=y val3=xx val4=yy
val1=x
val1=x val2=y
;
run;

proc sql ;
  select max(counter) into :maxcount
  from count
  ;
quit ;

%put &=maxcount ;

data output;
  set count;
  array Values{&maxcount} $;
  do i = 1 to counter;
    Values(i) = scan(column,2*i,'= ');
  end;
  drop i ;
run;

SAS需要在数据步骤编译时知道数组的大小,这就是为什么你不能使用数据步变量来定义数组的大小。

答案 1 :(得分:0)

昆汀拥有所有正确的想法。但是,还有一些改进的空间:

  1. 不需要额外的SQL步骤(因此需要额外传递数据),因为可以在第一个DATA步骤中填充所需的宏变量。
  2. 如果任何值的长度超过8,则数组元素长度规范$将截断它,因为它默认为8.解决方法是在与数组维度相同的步骤中计算最大数组元素长度。
  3. 例如:

    data count (keep = column) ;                             
      infile cards eof = eof ;                               
      input column $50. ;                                    
      retain dim len ;                                       
      do _n_ = 1 to countW (column) ;                        
        len = len max length (scan (column, 2 * _n_, "= ")) ;
      end;                                                   
      dim = dim max (_n_ - 1) ;                              
      return ;                                               
      eof: call symputx ("dim", dim) ;                       
           call symputx ("len", len) ;                       
           delete ;                                          
      cards;                                                 
    val1=x val2=y val3=xx val4=yy12345678                    
    val1=x                                                   
    val1=x val2=y                                            
    ;                                                        
    run ;                                                    
    
    data output ;                                            
      set count ;                                            
      array values [&dim] $ &len ;                           
      do _n_ = 1 to countW (column) ;                        
        values[_n_] = scan (column, 2 * _n_, "= ") ;         
      end;                                                   
    run ;
    

    致以最诚挚的问候,

    保罗多夫曼