楼主: peijiamei
12313 9

sas函数应用问题? [推广有奖]

学科带头人

76%

还不是VIP/贵宾

-

威望
3
论坛币
26151 个
通用积分
12.3468
学术水平
217 点
热心指数
343 点
信用等级
210 点
经验
75410 点
帖子
1102
精华
1
在线时间
2016 小时
注册时间
2007-11-15
最后登录
2016-3-21

10论坛币
长沙孜信有限责任会计师事务所
中庆会计师事务所有限责任公司
河北华安会计师事务所有限公司
新疆华西会计师事务所
江苏天衡会计师事务所有限公司
山东正源和信有限责任会计师事务所
山东正源会计师事务所有限公司
普华永道中天会计师事务所
山东正源会计师事务所有限公司
安达信华强会计师事务所
中鸿信建元会计师事务所有限责任公司
山东烟台乾聚会计师事务所有限公司
云南亚太会计师事务所
大连正元会计师事务所
宁夏五联会计师事务所
浙江天健会计师事务所
天津津源会计师事务所
武汉会计师事务所
浙江天健会计师事务所
山西晋元会计师事务所
岳华(集团)会计师事务所


根据上面的变量生成一个新变量a,如果上面的变量中含有 天健或亚太或晋元  则a=1 否则a=0.
都有哪一些方法可以实现上上面的问题?
每种方法奖励10论坛币

最佳答案

flutter88 查看完整内容

最简单的是用index或者find函数了: if index(name,'天健') or index(name,'亚太') or index(name,'晋元') then a=1; else a=0;
关键词:SAS函数 应用问题 会计师事务所 有限责任公司 有限公司 函数 SAS 应用

本帖被以下文库推荐

我的微博:http://t.sina.com.cn/1087192374
欢迎互相加关注!
沙发
flutter88 发表于 2010-8-6 11:33:09 |只看作者 |坛友微信交流群
最简单的是用index或者find函数了:
if index(name,'天健') or  index(name,'亚太') or index(name,'晋元') then a=1;
else a=0;

使用道具

藤椅
pobel 在职认证  发表于 2010-8-6 11:45:13 |只看作者 |坛友微信交流群
1# peijiamei
data test;
input String $15.;
a=(find(string,"t","i")) or find(string,"w","i");
datalines;
Capital A here
Lower a here  
Apple         
;
和谐拯救危机

使用道具

板凳
yatming 发表于 2010-8-6 13:27:42 |只看作者 |坛友微信交流群
在sas中用find和index来处理中文字符匹配搜索会有问题,一般而言,建议where 来筛选,如果要标识,可以用case when,或者在find和index的结果在进行一层逻辑判断

bug如下:
  1. data _null_;
  2.         a='人大经济论坛赛仕专版';
  3.         c=find(a,'厶');
  4.         b=index(a,'厶');
  5.         put c b;
  6. run;
复制代码

可以得到结果是c和b为10.
原因在于一个中文字符为两个字节16位,而find和index内部机制是来搜索所要字符的ASCII码,因此会有这样的问题:一个中文字符的第二个字节和它紧跟的另一个字符的第一个字节,如将两者组合会有产生另一个中文字符,而这个中文字符又恰巧是需要查找的字符,导致结果并非是需要的。
此例中:
“论”ascII码:第一个字节:C2,第二个字节: DB
“坛”ascii码:第一个字节:CC,第二个字节: B3
而DB和CC却可以组成另一个中文:“厶”

因此这段中文虽然不含“厶”,但却含有其对应的ASCII,而find和index无法对这ASCII码是否同属一个中文字符进行判断,因此仍然会返回非零值。
所以如果对大量文本进行中文查找时,由于待查找量的庞大,无法预估是否会发生这样的情况,保守起见不会使用find和index函数。

而where 语句筛选无论是contains还是like都不会有这样的问题,如果需要打标识而不是筛选,可以使用proc sql的case when

index和find函数虽然返回非零值,但是在某些情况下再加一层判断也是可以进行处理的,因为index和find默认返回是字符所在字符串的位置,因此如果对全中文字符串进行查找时,返回的值一定是个奇数,原因就是中文是两个字节,所以起始字节的位置一定是奇数,可以对返回值是否为奇数判断,而如果返回偶数,便就是上面陈述的情况了。而如果目标字符串不是全中文,含有数字或者西文字符,则无法使用奇数的判断条件,非中文字符的一个字节会改变其它中文字符所在的位置。因此字符串中并不是所有中文都是以奇数为起始位的。
  1. proc sql;
  2.         create table ... as
  3.         select
  4.                 case when string contains '天健'
  5.                                 or string contains '亚太'
  6.                                 or string contains '晋元' then 1 else 0 end as a
  7.                 ....
  8.         from
  9.         ....
  10.         ;
  11. quit;
复制代码
已有 7 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
959712305 + 1 + 1 + 1 精彩帖子
李会超 + 40 精彩帖子
oneoneagain + 1 + 1 精彩帖子
mingfeng07 + 1 + 1 + 1 分析的很有深度啊
crackman + 1 + 1 说的很有道理
hopewell + 1 + 1 + 1 我很赞同
peijiamei + 100 + 1 精彩帖子

总评分: 经验 + 40  论坛币 + 100  学术水平 + 6  热心指数 + 5  信用等级 + 3   查看全部评分

使用道具

报纸
hopewell 发表于 2010-8-6 14:01:26 |只看作者 |坛友微信交流群
  1. data raw;
  2.         input text $1-50;
  3.         a=ifn(sum(kindex(text,'天健'),kindex(text,'亚太'),kindex(text,'晋元')),1,0);
  4. datalines;
  5. 长沙孜信有限责任会计师事务所
  6. 中庆会计师事务所有限责任公司
  7. 河北华安会计师事务所有限公司
  8. 新疆华西会计师事务所
  9. 江苏天衡会计师事务所有限公司
  10. 山东正源和信有限责任会计师事务所
  11. 山东正源会计师事务所有限公司
  12. 普华永道中天会计师事务所
  13. 山东正源会计师事务所有限公司
  14. 安达信华强会计师事务所
  15. 中鸿信建元会计师事务所有限责任公司
  16. 山东烟台乾聚会计师事务所有限公司
  17. 云南亚太会计师事务所
  18. 大连正元会计师事务所
  19. 宁夏五联会计师事务所
  20. 浙江天健会计师事务所
  21. 天津津源会计师事务所
  22. 武汉会计师事务所
  23. 浙江天健会计师事务所
  24. 山西晋元会计师事务所
  25. 岳华(集团)会计师事务所
  26. ;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
yatming + 1 + 1 + 1 发现往往要比实现更难,牛!
peijiamei + 20 精彩帖子

总评分: 论坛币 + 20  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

地板
yatming 发表于 2010-8-6 14:43:32 |只看作者 |坛友微信交流群
5# hopewell
真人不露相,一出手就是强贴,牛~
不过看help,貌似看不出kindex的内部机制,是否函数内对字符串进行了字符分割。。。

使用道具

7
realfun 发表于 2014-4-15 17:43:54 |只看作者 |坛友微信交流群
很有收获!!

使用道具

8
wodematlab 发表于 2015-10-18 09:55:36 |只看作者 |坛友微信交流群
如果后面跟很多类似于天健的名字如何处理

使用道具

9
pingguzh 发表于 2016-11-16 14:49:01 |只看作者 |坛友微信交流群
yatming真的是高手啊!佩服!

使用道具

10
sity1990 在职认证  发表于 2018-4-2 17:12:30 |只看作者 |坛友微信交流群
两位大神

使用道具

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

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

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

GMT+8, 2024-4-20 00:03