1

数据如下:

ID----X1----X2----X3----Z1----Z2----Z3

对于每个 ID,考虑两组变量{X1, X2, X3}{Z1, Z2, Z3}并且:

  • Xs 和Zs 的数量可以相等或不相等。它们也可能有缺失值。
  • 每组变量的值是唯一的。也就是说,对于每个 ID,X1 不等于 X2 不等于 X3。这同样适用于 Zs。
  • Xs和Zs的值可以相等,问题来了。如何创建保留 Xs 和 Zs 相等值并排除不相等值的新数据。例如,如果 X1 等于任何 Zs,则 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      .      .
4

2 回答 2

3

如果我理解正确,您需要分别处理每个数组。首先,X将不在的值设置为缺失Z,然后返回并设置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;
于 2013-06-28T14:39:58.510 回答
1

现在不在 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 中的元素或反之亦然的情况下您想做什么,因此此代码将保持原样。

于 2013-06-28T11:43:39.080 回答