直接参考SAS中的一个精确单元

时间:2015-06-08 08:48:30

标签: macros sas cell

出于可重现性的原因,我的一个程序所需的所有参数都存储在Excel文件中。 然后,我可以执行 proc import 将此Excel视为Sas数据库,该数据库可以正常工作。

但后来我想知道是否有一种简单的方法来访问这个"数据库"中的某些特定值。我希望能够编写像

这样的代码
if var1 < "line 5, column F4" then var2= 3*"line 5, colmun F5"

等等。一个问题是有很多不同性质的参数,因此创建的sas数据库不是一个干净的。

这是一个相对较短的数据集(大约15行和10列),所以即使它不是最好的编程事情,我想也许一种方法是在整个数据集上运行一个程序来创建一个宏变量A1,A2等,但我不知道如何做到这一点。

由于

EDIT1:excel的样子

enter image description here

EDIT2  更一般地说,我的问题是我有以下程序必须每年运行,但数值会随着时间的推移而变化,并且有多年来人们指责改变它们并没有改变所有这些,所以我们是尝试一种方法来更改这些值更自动

 /* LORSQUE DANS UN FOYER IL Y A DES ENFANTS LES PARTS SONT ATTRIBUEES A LA PERSONNE     AYANT LES REVENUS LES PLUS ELEVES */
N=1;
if first.nomen then N=N+(nbenf=1)*.5+(nbenf=2)+(nbenf>2)*(nbenf-1);

/* On calcule les abattements de pensions-retraites sur zperi  (il faudrait ventiler en zreti, zalri, zrtoi pour affiner car le régime d'abattement n'est pas le meme pour les pensions et les rentes) l'impot est calculé individuellement */

if activite='3333' /*au chômage toute l'année page 313(Brochure pratique: fiche de calculs)*/
then ab10s=int(min(max(min(0.1*ztsai,12000),924),ztsai));
else ab10s=int(min(max(min(0.1*ztsai,12000),421),ztsai));
           /*Pensions retraites P285(fiche de calculs)*/
ab10r=int(min(max(min(0.1*zperi,3660),374),zperi));;

/* Calcul du montant du revenu net imposable */
mrni=int(sum(ztsai,-ab10s,zperi,-ab10r,zragi,zrici,zrnci));
/* Abattement spécial pour les plus de 65 ans */
if aneec<"&nais65" then
do;
    if mrni<14510 then mrni=max(0,sum(mrni,-2312));else   /*page 308*/
    if mrni<23390 then mrni=sum(mrni,-1156);
end;

    /* Calcul du Quotient Familial */
    QF=mrni/N;
    /* Maj le 17/06/2014 - 1 tranche haute supplémentaire en 2012*/
ir=int(max(0,
( 5963 < QF <= 11896) * (mrni*0.055 -  327.97*N)
+(11896 < QF <= 26420) * (mrni*0.14  - 1339.13*N)
+(26420 < QF <= 70830) * (mrni*0.30  - 5566.33*N)
+(70830 < QF <= 150000) * (mrni*0.41  -13357.63*N)
+(150000< QF        ) * (mrni*0.45  -19357.63*N)));

/* PLAFONNEMENT DU QUOTIENT FAMILIAL */
/*     P 289 plafonnement du quotient familial*/
ir2=int(max(0,
( 5963 < QF <= 11896) * (mrni*0.055 -  327.97*N)
+(11896 < QF <= 26420) * (mrni*0.14  - 1339.13*N)
+(26420 < QF <= 70830) * (mrni*0.30  - 5566.33*N)
+(70830 < QF <= 150000) * (mrni*0.41  -13357.63*N)
+(150000< QF        ) * (mrni*0.45  -19357.63*N)));

ir2=max(0,ir2-2000*(N-1)/.5); /*page 317*/

if ir<ir2 then ir=ir2;

/* DECOTE */ /*page 317*/

if ir<960 then ir=max(0,ir-(480-(ir/2)));

/* SEUIL DE MISE EN RECOUVREMENT */

if ir<61 then ir=0;  
run;

2 个答案:

答案 0 :(得分:1)

这个任务通常不用sas处理。 无论如何,您可以使用的方法是定义一个宏,该宏将在每个比较术语中放入一个宏变量。

%macro comp(line=,var=,temp=);
data _null_;
set have;
if _N_=&line then call symputx("&temp","&var",'g');
run;
%mend;

然后在datastep之前调用它,例如在你的情况下:

if var1 < "line 5, column F4" then var2= 3*"line 5, colmun F5"

你会这样做:

%comp(line=5,var=F4,temp=first);
%comp(line=5,var=F5,temp=second);

data want;
set have;
if var1 < &first. then var2 = 3*&second.;
run;

如果您需要进一步的支持,请告诉我。

答案 1 :(得分:0)

您是否考虑过使用直接访问&#34; point = + variable&#34;名称方法,如果你有一个大桌子,并且你不需要在坐标旁边的任何其他信息&#39;你在追求。