我有一个包含一些变量的表,比如var1
和var2
以及一个标识符,由于某些原因,某些标识符有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
我可以通过重命名我的所有变量,然后将表与重命名的表合并并删除重复项来实现,但我认为必须有一个更简单的版本。
答案 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;