楼主: qinly10
7156 3

如何利用sas将多行却属同一个id的obs的几个变量转换至同一行? [推广有奖]

  • 1关注
  • 0粉丝

已卖:1份资源

本科生

92%

还不是VIP/贵宾

-

威望
0
论坛币
361 个
通用积分
4.2000
学术水平
5 点
热心指数
4 点
信用等级
3 点
经验
2327 点
帖子
66
精华
0
在线时间
164 小时
注册时间
2010-12-1
最后登录
2024-12-21

楼主
qinly10 发表于 2012-12-22 00:28:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
大家好,我有数据: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值,后类似。新数据集中的命名最好能和上表一致,以区分次数。请问如何实现?最好能有程序说明。先谢了!

二维码

扫码加我 拉你入群

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

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

关键词:变量转换 obs Input cards 如何实现 sas 多行 转换 单行

回帖推荐

yongyitian 发表于2楼  查看完整内容

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; p ...

沙发
yongyitian 发表于 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;

藤椅
luijb 在职认证  发表于 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;

西格玛临床统计服务工作室http://www.sigma-stat.com/,luijb@163.com

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

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 13:50