使用Arrays在SAS中定义变量并执行循环

时间:2016-09-16 09:57:41

标签: arrays sas

我想在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;

如果我需要使用宏来执行此操作或其他操作,我将不胜感激?

2 个答案:

答案 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;