全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7183 3
2012-12-22
大家好,我有数据:data a;

input id p1 p2 p3;
cards;
1 111 112 113
1 121 122 .
1 131 132 133
2 211 . 213
2 221 222 223
3 311 312 313
3 321 322 323
3 331 332 333
3 341 342 343
;


要将其转换成以下样式,使得同属一个id的数据转至一行,且变量要按照顺序依次排列:
id

p11

p21

p31

p12

p22

p32

p13

p23

p33

p14

p24

p34

1

111

112

113

121

122

.

131

132

133

.

.

.

2

211

.

213

221

222

223

.

.

.

.

.

.

3

311

312

313

321

322

323

331

332

333

341

342

343


其中p21代表第一次的p2值,p12代表第二次的p1值,后类似。新数据集中的命名最好能和上表一致,以区分次数。请问如何实现?最好能有程序说明。先谢了!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-12-22 05:47:52
Hi, You can write a macro for the following code if there are more variables.

data test;
input id p1 p2 p3;
cards;
1 111 112 113
1 121 122 .
1 131 132 133
2 211 . 213
2 221 222 223
3 311 312 313
3 321 322 323
3 331 332 333
3 341 342 343
; run;
data test_1;    set test(keep = ID P1); run;
data test_2;    set test(keep = ID p2); run;
data test_3;    set test(keep = ID p3); run;
proc sort      data=test_1 out=test_1_sort;   by ID; run;
proc sort      data=test_2 out=test_2_sort;   by ID; run;
proc sort      data=test_3 out=test_3_sort;   by ID; run;

data test_p1;
   set test_1_sort;
   if first.id then do;    N_id=1;  end;
   else N_id+1;
   by id;
run;

data test_p2;
   set test_2_sort;
   if first.id then do;    N_id=1;  end;
   else N_id+1;
   by id;
run;
data test_p3;
   set test_3_sort;
   if first.id then do;    N_id=1;  end;
   else N_id+1;
   by id;
run;

proc transpose data=test_p1 out=test_p1trans (drop=_name_) prefix=P1;
     by id;
         var p1;
         iD  N_id;
run;
proc transpose data=test_p2 out=test_p2trans (drop=_name_) prefix=P2;
     by id;
         var p2;
         iD  N_id;
run;proc transpose data=test_p3 out=test_p3trans (drop=_name_) prefix=P3;
     by id;
         var p3;
         iD  N_id;
run;

data test_result;
   merge test_p1trans test_p2trans test_p3trans;
   by ID;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-12-22 10:09:00
data a;
input id p1 p2 p3;
cards;
1 111 112 113
1 121 122 .
1 131 132 133
2 211 . 213
2 221 222 223
3 311 312 313
3 321 322 323
3 331 332 333
3 341 342 343
;
run;

data b;
retain id;
array pone(3);
array ptwo(3);
array pthree(3);
do i=1 to 3;
set a;
pone(i)=p1;
ptwo(i)=p2;
pthree(i)=p3;
end;
drop i p1 p2 p3;
run;

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-12-27 15:37:46
luijb 发表于 2012-12-22 10:09
data a;
input id p1 p2 p3;
cards;
您这个方法也很好用,但是如果变量多,比如我加了P4,貌似后面都改成四就没用了,还得跟你请教下应该怎么办呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群