1

我有一些具有指定值的变量。

%let a_val=20;
%let b_val=30;
%let c_val=40;

我也有一个看起来像这样的数据集。

data have;
input name $ a b c;
cards;
joe 1 1 2
jim 3 2 3
jak 5 3 5
;
run;

现在,我需要创建变量 p1-p5,将 a_vals、b_vals 和 c_vals 相加(如果它们与值匹配)。例如,由于 joe 对于 a 和 b 的值为 1,因此 p1 将是 a_val 和 b_val 的和,即 50。对于 jim 和 jak,p1 的值将为零,因为它们没有值 1。类似地,对于 jak,p2 为 0,对于 jim 为 30,对于 joe 为 40。

完成的数据集如下所示

>name p1  p2  p3  p4  p5
>joe  50  40   0   0   0
>jim   0  30  40   0   0
>jak   0   0  30   0  60

我试图用这样的do循环来做到这一点:

data attempt;
set have;
do i=1 to 5;
p&i=0;
if a=i then p&i=p&i+a_val;
if b=i then p&i=p&i+b_val;
if c=i then p&i=p&i+c_val;
end;
run;

我在正确的轨道上吗?

谢谢!任何帮助表示赞赏。

4

1 回答 1

2

您在这里混合了宏代码和数据步骤代码。

一种选择:

data want;
set have;
array p p1-p5;
do _i=1 to 5;
 p[_i] = sum((a=_i)*&a_val,(b=_i)*&b_val,(c=_i)*&c_val);
end;
run;

您也可以想象遍历数组中的 ac 变量;如果是这样,那么您需要使用symget来获取与数组元素关联的宏变量的值。对于 3 个变量,这是不值得的。

这将是这样的:

data want;
set have;
array p p1-p5;
array var a b c;
do _i=1 to 5;
    do _j = 1 to dim(var);
        p[_i] = sum(p[_i],(var[_j]=_i)*symget(cats(vname(var[_j]),'_val')));
    end;
end;
run;
于 2014-03-18T18:03:02.787 回答