连接重复值

时间:2014-11-28 15:33:03

标签: sas

我有一个包含一些变量的表,比如var1var2以及一个标识符,由于某些原因,某些标识符有2个观察值。

我想知道是否有一种简单的方法可以将同一标识符的第二次观察放回第一次,即

  • 而不是两个观察点,每个观察点都有var1 var2个变量用于相同的标识符值
ID    var1    var2
------------------
A1    12      13
A1    43      53
  • 只有一个,但有var1 var2 var1_2 var2_2之类的内容。
ID    var1    var2    var1_2    var2_2
--------------------------------------
A1    12      13      43        53

我可以通过重命名我的所有变量,然后将表与重命名的表合并并删除重复项来实现,但我认为必须有一个更简单的版本。

3 个答案:

答案 0 :(得分:1)

实际上,你关于合并价值的建议可能是最好的。

如果您的任何给定ID最多有1个副本,则此方法有效。

data first dups;
set have;
by id;
if first.id then output first;
else output dups;
run;

proc sql noprint;
create table want as
select a.id,
       a.var1,
       a.var2,
       b.var1 as var1_2,
       b.var2 as var2_2
from first as a
  left join
     dups as b
  on a.id=b.id;
quit;

答案 1 :(得分:1)

另一种方法使用PROC TRANSPOSE和数据步合并:

/* You can experiment by adding more data to this datalines step */
data have;
infile datalines;
input ID :  $2.   var1    var2;
datalines;
A1    12      13
A1    43      53
;
run;

/* This step puts the var1 values onto one line */
proc transpose data=tab out=new1 (drop=_NAME_) prefix=var1_;
  by id;
  var var1;
run;

/* This does the same for the var2 values */
proc transpose data=tab out=new2 (drop=_NAME_) prefix=var2_;
  by id;
  var var2;
run;

/* The two transposed datasets are then merged together to give one line */
data want;
  merge new1 new2;
    by id;
run;

举个例子:

data tab;
infile datalines;
input ID :  $2.   var1    var2;
datalines;
A1    12      13
A1    43      53
A2    199     342
A2    1132    111
A2    91913   199191
B1    1212    43214
;
run;

给出:

ID  var1_1  var1_2  var1_3  var2_1  var2_2  var2_3
---------------------------------------------------
A1  12      43      .       13      53      .
A2  199     1132    91913   342     111     199191
B1  1212    .       .       43214   .       .

答案 2 :(得分:0)

使用IDGROUP中的PROC SUMMARY功能,这是一种非常简单的方法。

data have;
input ID $ var1 $ var2 $;
datalines;
A1    12      13
A1    43      53
;
run;

proc summary data=have nway;
class id;
output out=want (drop=_:)
        idgroup(out[2] (var1 var2)=);
run;