使用数据步骤,我想将变量包含在数组参数中。
为什么呢? 我想声明一个数组,然后用数据填充它(数组所需的长度未知/将来可能会改变)。 我当前的数据集如下:
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;
答案 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)
昆汀拥有所有正确的想法。但是,还有一些改进的空间:
例如:
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 ;
致以最诚挚的问候,
保罗多夫曼