Переменные SAS в массиве

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

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

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

Теперь я хочу создать столбцы, используя массив для считываний valX. Таким образом, шаг данных используется для подсчета количества вхождений "val", что дало мне столбец 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 ответа

Решение

После создания 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. Нет необходимости в дополнительном шаге 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 ;

С наилучшими пожеланиями,

Пол Дорфман

Другие вопросы по тегам