我想在SAS Arrays上做一些帮助并做循环
我有一些代码几乎可以工作,并希望解释为什么它没有按预期工作。如果我能理解为什么它不起作用那么这将有助于B部分根本不起作用。 A部分) 我有四个变量ILC_Financial_products_owned__ var81 var82 var83,它可以取任何值01到14(注意它们是字符,这在以后很重要)。我希望创建14个新变量fin_own01到fin-own14,如果前四个变量中的任何一个包含该值,则它们为1或缺失。例如,如果ILC_Financial_products_owned__ =' 01'然后fin_own01 = 1。
data a;
set b;
fin_own{14} ;
do j = '01','02','03','04','05','06','07',
'08','09','10','11','12','13','14';
if ILC_Financial_products_owned__ = j
or var81 = j or var82 = j or var83 = j
then fin_own{j} = 1;
run;
这会创建变量fin_own1,fin_own2等。我想知道它为什么不创建名为fin_own01,fin_own02的变量。除此之外它是有效的
B部分) 现在变得越来越难而不是价值观' 01'到' 14'我还有另外4个变量,可以是' 01' 06'' 71'' A2' (我已经缩短了下面的清单40)。这些值不是连续性的,因为我可以解决问题中的字符值,如A部分所述。现在的问题是,如果我尝试类似的代码,我会得到
错误消息数组下标超出范围 当我尝试分配新值leisure_reg {k} = 1;
时data a;
set b;
array leisure_reg{40} ;
do k = '01','06','08','11','13','14','15','16','17','20','21','24','26','27','29','30','32','33','35','36'
,'38','41','42','48','50','51','52','53','58','60','64','68','70','71','72','73','94','95','A2','A4';
if ilc_regular_leisure_interestsac = k or var100 = k or var101 = k or var102 = k or var103 = k then leisure_reg{k} = 1;
如果我需要使用宏来执行此操作或其他操作,我将不胜感激?
答案 0 :(得分:0)
关于A部分,当您定义数组而没有明确命名变量时,SAS将默认为编号范围,从1到n - 在本例中为14。
以下将达到您想要的结果:
array fin_own{14} fin_own01 fin_own02 /* etc */ fin_own13 fin_own14 ;
您可以使用查找值数组来解决B部分中的问题。
简化示例:
array kvalues{5} $2. ('01', '03', '05', 'A3', 'B7') ; array leisure_reg{5} ; do k = 1 to dim(kvalues) ; v = kvalues{k} ; leisure_reg{k} = (ilc_regular_leisure_interestsac = v or var100 = v or var101 = v or var102 = v or var103 = v) ; end ;
如果您需要根据k值而不是数组索引命名leisure_reg变量,则必须创建一个新字段并在之后转置它:
array kvalues{5} $2. ('01', '03', '05', 'A3', 'B7') ; array leisure_reg{5} ; do k = 1 to dim(kvalues) ; v = kvalues{k} ; leisure_reg{k} = (ilc_regular_leisure_interestsac = v or var100 = v or var101 = v or var102 = v or var103 = v) ; kvar = cats('leisure_reg',v) ; kval = leisure_reg{k} ; output ; end ; /* proc transpose on with kvar as ID, kval as var */
答案 1 :(得分:0)
回答A部分。定义两个数组,一个用于新数组,一个用于旧变量。由于索引是1到14,因此将其转换为数字并在数组索引中使用它。
Array fin_own(14) fin_own01 - fin_own14 (14*0);
Array old_val(4) var81 var84;
Do I=1 to 4;
Index=input(old_val, 8.);
Fin_own(index) = 1;
End;