楼主: noyazz
2184 9

菜鸟问两个简单的SAS编程问题,涉及dataset转换,多谢指教! [推广有奖]

  • 0关注
  • 0粉丝

小学生

35%

还不是VIP/贵宾

-

威望
0
论坛币
5 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
55 点
帖子
7
精华
0
在线时间
2 小时
注册时间
2013-7-31
最后登录
2015-7-25

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
1. 现有dataset如下,假设已经按照id和code排好序而且去除了code的重复值(其实去不去重是不是无所谓?)
idcode

101

1

101

3

101

6

102

2

102

4

103

2

103

3

103

5

103

8



希望转换成如下格式,新dataset对于id是unique的,新建变量a1到a8,如果对于同一个id,变量code的value中出现了某个数值n,则对应an=1,否则为0.
ida1a2a3a4a5a6a7a8

101

1

0

1

0

0

1

0

0

102

0

1

0

1

0

0

0

0

103

0

1

1

0

1

0

0

1




2. 现有dataset如下,code1-code5全部是字符型变量
idcode1code2code3code4code5

101

101a235000

101

49v86000

101

6630000

102

v86237000

102

v86aaabbb00

103

c639000

103

450000

103

6660000

103

a720000


希望建立一个unique id的dataset,新建变量flag_v86,对于同一个id,如果v86在code1-code5中出现至少一次,则flag_v86=1,否则为0。
flag_v86

101

1

102

1

103

0



我想任务并不难,可能是用retain和if.first, if.last语句,但我自己写不出来。恳请大家指教,多谢!
二维码

扫码加我 拉你入群

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

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

关键词:dataset sas编程问题 SAS编程 DataS Data 而且 新建 最好

沙发
crazygoing 发表于 2014-9-30 10:04:00 |只看作者 |坛友微信交流群
第一个问题
  1. data a;
  2. input id        code @@;
  3. cards;
  4. 101 1
  5. 101 3
  6. 101 6
  7. 102 2
  8. 102 4
  9. 103 2
  10. 103 3
  11. 103 5
  12. 103 8
  13. ;
  14. run;
  15. proc freq data=a;
  16. table id*code/nopct norow nocol out=b;
  17. run;
  18. proc transpose data=b out=c prefix=s ;
  19. var count;
  20. by id ;
  21. id code;
  22. run;
  23. data c;set c;drop _name_ _label_; run;
复制代码

使用道具

藤椅
noyazz 发表于 2014-9-30 10:17:23 |只看作者 |坛友微信交流群
crazygoing 发表于 2014-9-30 10:04
第一个问题
多谢解答!能否不用proc步,仅用data步完成?

使用道具

板凳
eflucy 发表于 2014-9-30 10:28:24 |只看作者 |坛友微信交流群
merge a(where=( a1=1) rename=(code=a1))
     a(where=( a2=2) rename=(code=a2))
     ... ...
     a(where=( a8=8) rename=(code=a8));  
  by id;
run;
???
我用不好transpose  一直写data步。。。

update:还得把.改成0;非.改成1...

使用道具

报纸
crazygoing 发表于 2014-9-30 10:29:33 |只看作者 |坛友微信交流群
第二个问题
  1. data a;
  2. input id code1 $         code2$        code3 $        code4 $        code5 $ @@;
  3. cards;
  4. 101 101        a235        0        0        0
  5. 101 49        v86        v86        0        0
  6. 101 663        0        0        0        0
  7. 102 v86        237        0        0        0
  8. 102 v86        aaa        bbb        0        0
  9. 103 c63        9        0        0        0
  10. 103 45        0        0        0        0
  11. 103 666        0        0        0        0
  12. 103 a72        0        0        0        0
  13. ;
  14. run;

  15. data b;set a;
  16. count=0;
  17. array ss{5} code1-code5;
  18. do i=1 to 5;
  19. if         ss[i]="v86" then count=count+1;
  20. end;
  21. keep id count;
  22. if count>1 then count=1;
  23. run;
  24. proc sort data=b out=c ;
  25. by id  descending count ;
  26. run;
  27. proc sort data=c out=c nodupkey;
  28. by id ;
  29. run;
复制代码

使用道具

地板
crazygoing 发表于 2014-9-30 10:31:59 |只看作者 |坛友微信交流群
noyazz 发表于 2014-9-30 10:17
多谢解答!能否不用proc步,仅用data步完成?
只用data步我不会,不过根据三楼的思路,可以利用macro建立循环data步,省点代码。

使用道具

7
苹果叶 在职认证  发表于 2014-9-30 10:56:42 |只看作者 |坛友微信交流群
  1. proc transpose data=a out=t_a;
  2.   var code;
  3.   by id;
  4.   id code;
  5. run;

  6. data final;
  7.   set t_a;
  8.   array _ _1-_8 ;
  9.   array n n1-n8;
  10.   do over n;
  11.     if _=. then n=0;
  12.     else n=1;
  13.   end;
  14.   drop _:;
  15. run;
复制代码

使用道具

8
小迷彩魂 发表于 2014-9-30 11:13:33 |只看作者 |坛友微信交流群
感谢分享                                                                        
                                       
                                                     
                                                     
                                             
                                                                 
                                                                                 

使用道具

9
苹果叶 在职认证  发表于 2014-9-30 11:39:16 |只看作者 |坛友微信交流群
Question 2:
  1. data a1;
  2.   set a;
  3.   array code code1-code5;
  4.   do over code;
  5.     if code='v86' then flag_v86=1;
  6.     else if flag_v86 ne 1 then flag_v86=0;
  7.   end;
  8.   drop code:;
  9. run;

  10. proc sort data=a1;
  11.   by id flag_v86;
  12. run;

  13. data final;
  14.   set a1;
  15.     by id flag_v86;
  16.   if last.id;
  17. run;
复制代码

使用道具

10
noyazz 发表于 2014-9-30 12:06:42 |只看作者 |坛友微信交流群
谢谢大家的解答!求用array retain和if first/if last相结合的方法,同事不喜欢用proc transpose,我得配合...

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

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

GMT+8, 2024-4-27 02:57