Переменные SAS в массиве - PullRequest
0 голосов
/ 06 июня 2018

Используя шаг данных, я хочу включить переменную в качестве параметра массива.

Почему?Я хочу объявить массив, а затем заполнить его данными (необходимая длина для массива неизвестна / может измениться в будущем).Мой текущий набор данных выглядит так:

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

Теперь я хочу создать столбцы, используя массив для считываний valX.Таким образом, шаг данных используется для подсчета количества вхождений «val», что дало мне столбец count с количеством count.

(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 голосов
/ 12 июня 2018

У Квентина есть все правильные идеи.Однако есть некоторые возможности для улучшения:

  1. Нет необходимости в дополнительном шаге SQL (и, следовательно, в дополнительном проходе по данным), поскольку необходимые макропеременные могут быть заполнены на первом шаге DATA.
  2. Если какое-либо значение превышает 8 по длине, спецификация длины элемента массива $ усекает его, поскольку по умолчанию оно равно 8. Средство исправления состоит в том, чтобы вычислить максимальную длину элемента массива на том же шаге, что и измерение массива.

Например:

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 ;

С уважением,

Пол Дорфман

0 голосов
/ 06 июня 2018

После создания 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 должен знать размер массива при компиляции шага данных, поэтому нельзя использовать переменную шага данных для определения размера массива.

...