如何对比两组变量(在SAS中)
数据如下所示:如何对比两组变量(在SAS中),sas,Sas,数据如下所示: ID----X1----X2----X3----Z1----Z2----Z3 对于每个ID,考虑两组变量 {x1,x2,x3}和 {Z1,Z2,Z3} >: X和Z的数量可能相等,也可能不相等。它们也可能缺少值 每个集合中的变量值都是唯一的。也就是说,对于每个ID,X1不等于X2不等于X3。这同样适用于Zs Xs和Zs的值可以相等,问题就来了。如何创建一个新数据,该数据保留相等的Xs和Zs值,并排除不相等的值。例如,如果X1等于任何Z,则X1将与Z一起保留 考虑一个假设数据:
ID----X1----X2----X3----Z1----Z2----Z3
对于每个ID,考虑两组变量<代码> {x1,x2,x3}和<代码> {Z1,Z2,Z3} >:
- X和Z的数量可能相等,也可能不相等。它们也可能缺少值
- 每个集合中的变量值都是唯一的。也就是说,对于每个ID,X1不等于X2不等于X3。这同样适用于Zs李>
- Xs和Zs的值可以相等,问题就来了。如何创建一个新数据,该数据保留相等的Xs和Zs值,并排除不相等的值。例如,如果X1等于任何Z,则X1将与Z一起保留
data temp;
input ID x1 x2 x3 z1 z2 z3;
datalines;
1001 11 12 13 . 12 11
1002 21 22 23 24 25 26
1003 31 32 33 31 32 .
1004 41 42 43 41 44 45
;
run;
我希望它是:
1001 11 12 . . 12 11
1002 . . . . . .
1003 31 32 . 31 32 .
1004 41 . . 41 . .
现在不在sas旁边,但这应该大致就是您所追求的:
data test;
set temp;
array arrx{*} x:;
array arrz{*} z:;
arriter = max(dim(arrx), dim(arrz));
do _i = 1 to arriter;
if arrx{_i} ne arrz{_i} then do;
arrx{_i} = .;
arrz{_i} = .;
end;
end;
run;
我不确定在x中的元素比z中的元素多的情况下,或者在z中的元素比x中的元素多的情况下,您想做什么,因此此代码将保持原样。如果我理解正确,您需要单独处理每个数组。首先,将
X
中不在Z
中的值设置为missing,然后返回并在Z
中设置不在X
中的值。试试这个:
data want;
set temp;
array Xarr{*} x:;
array Zarr{*} z:;
do _i_=1 to dim(Xarr);
if not (Xarr(_i_) in Zarr)
then Xarr(_i_) = .;
end;
do _i_=1 to dim(Zarr);
if not (Zarr(_i_) in Xarr)
then Zarr(_i_) = .;
end;
drop _i_;
run;
我喜欢数组解决方案,但问题是每个x与任何z进行比较-您的代码只会将每个x与相应的z进行比较。