Переменные 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 должен знать размер массива при компиляции шага данных, поэтому вы не можете использовать переменную шага данных для определения размера массива.
У Квентина есть все правильные идеи. Тем не менее, есть некоторые возможности для улучшения:
- Нет необходимости в дополнительном шаге SQL (и, следовательно, в дополнительном проходе по данным), поскольку необходимые макропеременные могут быть заполнены на первом шаге DATA.
- Если какое-либо значение превышает 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 ;
С наилучшими пожеланиями,
Пол Дорфман