如何对比两组变量(在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进行比较。