Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 根据条件动态创建变量,SAS_Loops_Sas - Fatal编程技术网

Loops 根据条件动态创建变量,SAS

Loops 根据条件动态创建变量,SAS,loops,sas,Loops,Sas,我的问题如下: 我有一个包含两列的数据集 number_of_years payment 4 100 5 123 2 52 我想创建一个新的变量(或一组变量,然后求和),并根据列number of years中的值添加值 新变量应获得以下值: number_of_years payment new_variable 4 100 100*1.01**4 + 100*1.01**

我的问题如下:

我有一个包含两列的数据集

number_of_years payment
4               100
5               123
2               52
我想创建一个新的变量(或一组变量,然后求和),并根据列number of years中的值添加值

新变量应获得以下值:

number_of_years payment new_variable
4               100     100*1.01**4 + 100*1.01**3 + 100*1.01**2 + 100*1.01**1
5               123     123*1.01**5 + 123*1.01**4 + 123*1.01**3 + 123*1.01**2 + 123*1.01*1 
2               52      52*1.01**2 + 52*1.01**1   
e.t.c.  
我最初的想法是将列number_of_years中的一个值放入宏变量中,用它的值循环创建其他列,然后求和,但它不起作用

data uprava;
 set work.data_diskontace;

%let value1=number_of_years;

%macro spocti(n);
%do i=1 %to &n; 
new_variable&i = payment*1.01**&i;
%end;
%mend doit;
%spocti(value1);

run;

感谢您提出的建议。

您应该使用常规循环而不是宏循环,因为迭代次数是动态的,取决于
年数
变量

data uprava;
    set work.data_diskontace;

    new_variable = 0;
    do i = 1 to number_of_years;
         new_variable = new_variable + payment*1.01**i;
    end;
run;

您应该使用常规循环而不是宏循环,因为迭代的数量是动态的,取决于
年数
变量

data uprava;
    set work.data_diskontace;

    new_variable = 0;
    do i = 1 to number_of_years;
         new_variable = new_variable + payment*1.01**i;
    end;
run;

不需要宏这是一个收敛到

最简单的解决方案是:

data have;
input years payment;
cards;
4 100
5 123
2 52
;
run;

data want;
set have;
new_variable = (1.01*(1-1.01**years)/(1-1.01))*payment;
run;

不需要宏这是一个收敛到

最简单的解决方案是:

data have;
input years payment;
cards;
4 100
5 123
2 52
;
run;

data want;
set have;
new_variable = (1.01*(1-1.01**years)/(1-1.01))*payment;
run;

谢谢,我也找到了使用数组的解决方案。@jirijansa我的解决方案简单多了!不需要循环、阵列等。。。只是基本的数学谢谢,我也找到了使用数组的解决方案。@jirijansa我的解决方案简单多了!不需要循环、阵列等。。。只是基础数学