楼主: orlong
1978 8

求助SAS程序问题,寻高手 [推广有奖]

  • 1关注
  • 0粉丝

初中生

19%

还不是VIP/贵宾

-

威望
0
论坛币
3 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
179 点
帖子
11
精华
0
在线时间
8 小时
注册时间
2008-12-23
最后登录
2014-5-5

楼主
orlong 发表于 2010-5-31 18:14:33 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
问题程序如下:
data string;
  input string $40.;
  array myvars{27}   _temporary_ ;
  array my{27};
  if _n_ =1 then do i=1 to 27;
      myvars{i}=i;
   end;
   do i=1 to 27;
     if findw(string,myvars{i},",") then my{y}=1;
   end;
   drop i;
datalines;
1,4
3,13
1,2,3,4,7,8,9
19
2,5
1,2,3,10,17
1,2,3,4,5,6,7,8
2,3,4,7,9
1,2,3,19,20,23
1,2,3
1,2,3,15
8,10,13
;
run;

想得到如下结果:
Snap2.jpg
但程序老是出错,恳请高手指点问题出在哪里
非常感谢
二维码

扫码加我 拉你入群

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

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

关键词:sas程序 TEMPORARY string tring array 求助 程序 高手 SAS

Snap1.jpg (7.1 KB)

Snap1.jpg

沙发
gssdzc 在职认证  发表于 2010-5-31 18:17:18
顶起来,让sas高手来看看。帮帮忙

藤椅
zhangyangsmith 发表于 2010-5-31 22:09:26
Hope this helps

data
string;
input string $40.;
array myvars{27} _temporary_ ;
/* make sure the conversion was done correctly */
array my{27} $2.;
if _n_ =1 then do i=1 to 27;
myvars{i}=i;
end;
do i=1 to 27;
/* the leading and following spaces should be deleted */
if findw(strip(string), strip(myvars{i}),",") then my{i}=1;
end;
drop i;
datalines;
1,4
3,13
1,2,3,4,7,8,9
19
2,5
1,2,3,10,17
1,2,3,4,5,6,7,8
2,3,4,7,9
1,2,3,19,20,23
1,2,3
1,2,3,15
8,10,13
;
run;
已有 1 人评分热心指数 收起 理由
crackman + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

板凳
soporaeternus 发表于 2010-5-31 22:24:12
方法一:稍修改LZ算法
  1. data string;
  2. input string $40.;
  3. array my{27};       
  4. do i=1 to 27 by 1;
  5.         if indexw(string,compress(i),', ') then my{i}=1;
  6. end;
  7. drop i;
  8. datalines;
  9. 1,4
  10. 3,13
  11. 1,2,3,4,7,8,9
  12. 19
  13. 2,5
  14. 1,2,3,10,17
  15. 1,2,3,4,5,6,7,8
  16. 2,3,4,7,9
  17. 1,2,3,19,20,23
  18. 1,2,3
  19. 1,2,3,15
  20. 8,10,13
  21. ;
  22. run;
复制代码
方法二:每条作定步长例为27的判断,效率很低
稍微优化下,直接从string出发......
  1. data string1;
  2. input string $40.;
  3. array my{27};       
  4. do i=1 to count(string,",")+1 by 1;
  5.         my{scan(string,i,",")}=1;
  6. end;
  7. drop i;
  8. datalines;
  9. 1,4
  10. 3,13
  11. 1,2,3,4,7,8,9
  12. 19
  13. 2,5
  14. 1,2,3,10,17
  15. 1,2,3,4,5,6,7,8
  16. 2,3,4,7,9
  17. 1,2,3,19,20,23
  18. 1,2,3
  19. 1,2,3,15
  20. 8,10,13
  21. ;
  22. run;
复制代码
希望对你有帮助
已有 2 人评分学术水平 热心指数 收起 理由
pobel + 1 + 1 精彩帖子
crackman + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2   查看全部评分

Let them be hard, but never unjust

报纸
orlong 发表于 2010-5-31 23:07:11
楼上两位高人太强了
小弟拜服
发现自己问题所在了,原来是myvars{i}转换为character后的填充的空字符问题
soporaeternus 的两种方法太高了,学习了
都是高人啊

地板
bobguy 发表于 2010-6-1 01:40:30
orlong 发表于 2010-5-31 18:14
问题程序如下:
data string;
  input string $40.;
  array myvars{27}   _temporary_ ;
  array my{27};
  if _n_ =1 then do i=1 to 27;
      myvars{i}=i;
   end;
   do i=1 to 27;
     if findw(string,myvars{i},",") then my{y}=1;
   end;
   drop i;
datalines;
1,4
3,13
1,2,3,4,7,8,9
19
2,5
1,2,3,10,17
1,2,3,4,5,6,7,8
2,3,4,7,9
1,2,3,19,20,23
1,2,3
1,2,3,15
8,10,13
;
run;

想得到如下结果:

但程序老是出错,恳请高手指点问题出在哪里
非常感谢
I re-write it. It seems a little clear in logic.

1) take an element from the string as an array index until NO element left.
2) Set the correspond variable value to 1 with that index.

data string;
  input string $40.;
  array my{27};
  do i=1 by 1 while(1);
      k=scan( string,i);
      if k then k1=input(k,8.);
      else leave;
      my[k1]=1;
  end;

keep  string my:;
datalines;
1,4
3,13
1,2,3,4,7,8,9
19
2,5
1,2,3,10,17
1,2,3,4,5,6,7,8
2,3,4,7,9
1,2,3,19,20,23
1,2,3
1,2,3,15
8,10,13
;
run;

proc print;run;
已有 1 人评分热心指数 收起 理由
crackman + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

7
zhymqy 发表于 2010-6-1 09:30:43
不错,佩服!

8
orlong 发表于 2010-6-1 17:35:42
6# bobguy

高人,拜服,学习ing

9
ktzh443939748 发表于 2010-6-3 23:46:30
真厉害,牛人多呀

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

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