a***r 发帖数: 420 | 1 比如有一个dataset
group($) id($)
1 IND1
1 IND2
2 IND3
2 IND4
3 IND5
3 IND6
想把它变成:
group($) id_1($) id_2($)
1 IND1 IND2
2 IND3 IND4
3 IND5 IND6
应该怎么做?
sorry这个问题版上肯定有人问过,但是时间比较紧来不及考古了
非常感谢!! |
h********o 发帖数: 103 | 2 Try this:
============================
DATA TEST;
INPUT GROUP $ ID $;
CARDS;
1 IND1
1 IND2
2 IND3
2 IND4
3 IND5
3 IND6
;
PROC SORT DATA = ONE;
BY GROUP;
RUN;
DATA ONE(RENAME = (ID = ID1))
TWO(RENAME = (ID = ID2)) ;
SET TEST;
BY GROUP;
IF FIRST.GROUP THEN OUTPUT ONE;
IF LAST.GROUP THEN OUTPUT TWO;
RUN;
DATA FINAL;
MERGE ONE TWO;
BY GROUP;
RUN; |
s*********r 发帖数: 909 | 3 proc transpose data=old out=new(drop=_name_) prefix=id_;
by group;
var id;
run; |
a***r 发帖数: 420 | 4 thanks! that works
【在 h********o 的大作中提到】 : Try this: : ============================ : DATA TEST; : INPUT GROUP $ ID $; : CARDS; : 1 IND1 : 1 IND2 : 2 IND3 : 2 IND4 : 3 IND5
|
a***r 发帖数: 420 | 5 谢谢!
这个code比较短,不过我觉得在data步里做可能会快一些~
【在 s*********r 的大作中提到】 : proc transpose data=old out=new(drop=_name_) prefix=id_; : by group; : var id; : run;
|
d******9 发帖数: 404 | 6 You can use Proc Transpose or Array to do it.Here is the array method.
Proc sort data=Old ;
By Group;
Run;
Data New;
Set Old;
By group;
Array ID(n) $ V1-Vn; --- n is the max number of distinct ID in a group.
Retain V1-Vn;
Keep group V1-Vn;
If first.group then do I=1 to n;
CNT=0;
ID(I)=.;
End;
CNT+1;
ID(CNT)=ID;
If last.group;
Run;
【在 a***r 的大作中提到】 : 比如有一个dataset : group($) id($) : 1 IND1 : 1 IND2 : 2 IND3 : 2 IND4 : 3 IND5 : 3 IND6 : 想把它变成: : group($) id_1($) id_2($)
|
d******9 发帖数: 404 | 7 This is not a general method.
如果任何一个 group 有 > 2 的不同 ID, 比如说 Group 6 有 6个不同ID, 此方法就有
问题了。
【在 h********o 的大作中提到】 : Try this: : ============================ : DATA TEST; : INPUT GROUP $ ID $; : CARDS; : 1 IND1 : 1 IND2 : 2 IND3 : 2 IND4 : 3 IND5
|