并行遍历两个列表
Looping through two lists in parallel
我有以下值
Time Value
3 0.03
6 0.04
9 0.05
12 0.06
如你所见,它们分别以三步和一步移动。
如果我想为每个人应用以下公式
X=sum(X,2/value)
我该怎么办?
我试过如下:
data want;
array my_array{0-10} $ _temporary_;
X=0;
Do i=1 to 5;
My_array(i)=sum(x,2/value)*i;
X= =sum(x,2/value)*i;
End;
Total=X;
Run;
但是我没有循环遍历值,只是循环遍历时间(我从 1 到 4)。
我想每次应用上面的公式计算 X,以便在上面的 table 中多出一列,然后得到这些值的总和。
在 Kermit 在下面的回答中提供的示例中,预期输出(x 下的值应满足上述公式)如下:
time value x sum_x
3 0.03 200
6 0.04 300
9 0.05 360
12 0.06 400
如果我没理解错的话,时间会按季度设置,你想得到每次X的总和。下次,考虑在你的问题中给出预期的输出。
data stage1;
do time=3 to 12 by 3;
do value = 0.03, 0.04, 0.05, 0.06;
x=(2/value)*time;
output;
end;
end;
run;
proc sort data=stage1;
by time value;
run;
data want;
do _n_=1 by 1 until(last.time);
set stage1;
by time;
sum_x=sum(sum_x, x);
output;
end;
run;
time value x sum_x
3 0.03 200 200
3 0.04 150 350
3 0.05 120 470
3 0.06 100 570
6 0.03 400 400
6 0.04 300 700
6 0.05 240 940
6 0.06 200 1140
9 0.03 600 600
9 0.04 450 1050
9 0.05 360 1410
9 0.06 300 1710
12 0.03 800 800
12 0.04 600 1400
12 0.05 480 1880
12 0.06 400 2280
评论后编辑
为什么要使用 do 循环?只需在 table.
中执行 element-wise 乘法
data want;
set have;
x=(2/value)*time;
retain sum_x 0;
sum_x=sum(sum_x, x);
output;
run;
您的预期结果似乎与您对公式的解释不符。您可以使用两个数组来配对 TIME 和 VALUE 金额。
data want;
array t [4] _temporary_ (3 6 9 12);
array v [4] _temporary_ (0.03 0.04 0.05 0.06);
do index=1 to dim(t);
time=t[index];
value=v[index];
x=sum(x,2/value)*index;
output;
end;
run;
结果
Obs index time value x
1 1 3 0.03 66.67
2 2 6 0.04 233.33
3 3 9 0.05 820.00
4 4 12 0.06 3413.33
我有以下值
Time Value
3 0.03
6 0.04
9 0.05
12 0.06
如你所见,它们分别以三步和一步移动。 如果我想为每个人应用以下公式
X=sum(X,2/value)
我该怎么办?
我试过如下:
data want;
array my_array{0-10} $ _temporary_;
X=0;
Do i=1 to 5;
My_array(i)=sum(x,2/value)*i;
X= =sum(x,2/value)*i;
End;
Total=X;
Run;
但是我没有循环遍历值,只是循环遍历时间(我从 1 到 4)。 我想每次应用上面的公式计算 X,以便在上面的 table 中多出一列,然后得到这些值的总和。
在 Kermit 在下面的回答中提供的示例中,预期输出(x 下的值应满足上述公式)如下:
time value x sum_x
3 0.03 200
6 0.04 300
9 0.05 360
12 0.06 400
如果我没理解错的话,时间会按季度设置,你想得到每次X的总和。下次,考虑在你的问题中给出预期的输出。
data stage1;
do time=3 to 12 by 3;
do value = 0.03, 0.04, 0.05, 0.06;
x=(2/value)*time;
output;
end;
end;
run;
proc sort data=stage1;
by time value;
run;
data want;
do _n_=1 by 1 until(last.time);
set stage1;
by time;
sum_x=sum(sum_x, x);
output;
end;
run;
time value x sum_x
3 0.03 200 200
3 0.04 150 350
3 0.05 120 470
3 0.06 100 570
6 0.03 400 400
6 0.04 300 700
6 0.05 240 940
6 0.06 200 1140
9 0.03 600 600
9 0.04 450 1050
9 0.05 360 1410
9 0.06 300 1710
12 0.03 800 800
12 0.04 600 1400
12 0.05 480 1880
12 0.06 400 2280
评论后编辑
为什么要使用 do 循环?只需在 table.
中执行 element-wise 乘法data want;
set have;
x=(2/value)*time;
retain sum_x 0;
sum_x=sum(sum_x, x);
output;
run;
您的预期结果似乎与您对公式的解释不符。您可以使用两个数组来配对 TIME 和 VALUE 金额。
data want;
array t [4] _temporary_ (3 6 9 12);
array v [4] _temporary_ (0.03 0.04 0.05 0.06);
do index=1 to dim(t);
time=t[index];
value=v[index];
x=sum(x,2/value)*index;
output;
end;
run;
结果
Obs index time value x
1 1 3 0.03 66.67
2 2 6 0.04 233.33
3 3 9 0.05 820.00
4 4 12 0.06 3413.33