楼主: qinly10
6886 3

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

  • 1关注
  • 0粉丝

本科生

91%

还不是VIP/贵宾

-

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

+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
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-9-19 22:12