楼主: crackman
5661 12

跟crackman读SAS程序(11) [推广有奖]

已卖:401份资源

院士

83%

还不是VIP/贵宾

-

威望
6
论坛币
91928 个
通用积分
23.5045
学术水平
424 点
热心指数
505 点
信用等级
256 点
经验
112978 点
帖子
2940
精华
0
在线时间
2532 小时
注册时间
2007-4-26
最后登录
2025-6-25

初级热心勋章 中级热心勋章 初级学术勋章 初级信用勋章

楼主
crackman 发表于 2010-8-22 00:04:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
http://www.pinggu.org/bbs/thread-879935-1-1.html
寻找最大值
这个问题很常见 也很简单。这里主要看看高手bobugy的SQL程序和hopewell的DATA步的程序
第一个SQL
data t1;
   do i=1 to 10;
     g=ceil((3*ranuni(1)));
     x=round((10*ranuni(1)));
     output;
    end;
run;

proc print; run;

proc sql;
   select *, max(x) as max_x
   from t1
   group by g
   order by 2,1
   ;
   quit;
这个SQL很简单,但是很简洁,值得学习的就是order by 里面的 2, 1
其实这个等价于 order by x,i;
例外用了MAX函数,要学会在SQL里面使用函数,不仅仅是MAX其他函数都可以。

看看hopewell的程序:
data raw;
        input group value;
datalines;
1 3
1 5
1 8
2 1
2 5
3 3
3 5
3 1
4 5
4 12
4 8
;
data out;
        do _n_=1 by 1 until(last.group);
                set raw;
                by group;
                max=max(value,max);
        end;
        do _n_=1 to _n_;
                set raw;
                output;
        end;
run;

这个DATA步如果对于大量数据来说,效果应该是由于SQL语句的
在DATA步里面,实际上实现的是迭代,MAX为迭代变量。具体DO 循环改变DATA步运行程序对读入数据的比较可以看看跟crackman读SAS程序其他系列,说的很清楚。
后面的DO _N_=1 TO _N_;的循环等价 DATA OUT;SET RAW;
二维码

扫码加我 拉你入群

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

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

关键词:crackman Ackman CRACK sas程序 CRA 程序 SAS crackman

已有 2 人评分学术水平 热心指数 信用等级 收起 理由
kaeod + 1 + 1 + 1 精彩帖子
peijiamei + 5 + 5 + 5 精彩帖子

总评分: 学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

沙发
crackman 发表于 2010-8-22 04:36:36

跟crackman读SAS程序(12)

http://www.pinggu.org/bbs/thread-878037-1-1.html
原问题以及解答在上面,其中yatming对FIND+INDEX寻找字符的解释很值得学习
在这里解释一下下面程序中的KINDEX
data raw;
        input text $1-50;
        a=ifn(sum(kindex(text,'天健'),kindex(text,'亚太'),kindex(text,'晋元')),1,0);
datalines;
长沙孜信有限责任会计师事务所
中庆会计师事务所有限责任公司
河北华安会计师事务所有限公司
新疆华西会计师事务所
江苏天衡会计师事务所有限公司
山东正源和信有限责任会计师事务所
山东正源会计师事务所有限公司
普华永道中天会计师事务所
山东正源会计师事务所有限公司
安达信华强会计师事务所
中鸿信建元会计师事务所有限责任公司
山东烟台乾聚会计师事务所有限公司
云南亚太会计师事务所
大连正元会计师事务所
宁夏五联会计师事务所
浙江天健会计师事务所
天津津源会计师事务所
武汉会计师事务所
浙江天健会计师事务所
山西晋元会计师事务所
岳华(集团)会计师事务所
;


KINDEX在HELP里面的解释如下:
The KINDEXC function searches source, from left to right, for the first occurrence of any character present in the excerpts and returns the position in source of that character. If none of the characters in excerpt-1 through excerpt-n in source are found, KINDEXC returns a value of 0.
在这里引用一个例子:
data _null_;
     value = 'firstname lastname';
     pos=kindex(value,'s');
     put pos=;
   run;


大家看看结果就知道了

在这个程序难以理解应该是IFN(sum(......),1,0)
对于IFN这个函数,
IFN(logical-expression, value-returned-when-true, value-returned-when-false <,value-returned-when-missing>)

先是对SUM()这个语句进行的一个逻辑判断,这也是问题所在,SUM()如何进行的逻辑判断呢?
其实这个和之前在IF C=1 OR 2 有点一样,大家可以看看跟crackman读程序其他例子有详解和测试
那么SUM()返回的就是一个数字,如果是SUM()=0或者缺失就是 false,如果SUM()=1 就是TRUE,如果SUM()不等于1,也不等于0,也不是缺失值,那么就恒为TRUE。


可以做几个测试就知道:
data crackman;
a=ifn(0,1,0);
;
put a=;
data crackman;
a=ifn(1,1,0);
put a=;
data crackman;
a=ifn(2,1,0);
;
put a=;
data crackman;
a=ifn(.,1,0);
put a=;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
hopewell + 1 + 1 + 1 精彩帖子

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

藤椅
crackman 发表于 2010-8-22 05:44:38

跟crackman读SAS程序(13)

http://www.pinggu.org/bbs/thread-877885-1-1.html
原程序在这里
下面这个程序值得学习:

data a;  
        input d0 d1 d2 d3 d4 d5 d6 d7 d8 d9;
cards;
1 3 0 6 9 7 4 2 8 5
10 19 2 8 6 15 3 14 18 11
9 2 10 5 11 3 4 8 1 6
0 3 0 6 9 7 4 0 8 5
;
data b(drop=i j pos);
        set a;
        array d{*} d0-d9;
        array pos_d{*} pos_d0-pos_d9;
        do i=1 to dim(d);
                pos=1;
                do j=1 to dim(d);
                        pos=ifn(d(i)>d(j),pos+1,pos);
                end;
                pos_d(i)=pos;
        end;
run;


采取两个数组,进行外循环和内循环,同时使用迭代
SET A;之后是循环,改变DATA步的运行顺序,也是读入一个观测就执行一次循环处理,循环处理完之后读入第二个观测进行循环处理。
1.首先是对变量设置一个数组,然后对位置设置一个数组
2.首先是外循环,外循环是对变量数组的循环,在外循环 I=1时,开始内循环,内循环是对其他变量与当前的外循环变量比较,判断谁大谁小,同时将结果赋值给POS,POS实现迭代。
3.将结果赋值给POS_D数组中第I个值。
已有 3 人评分威望 学术水平 热心指数 信用等级 收起 理由
yatming + 1 精神可嘉!
hopewell + 1 + 1 + 1 精彩帖子
admin + 1 对论坛有贡献

总评分: 威望 + 1  学术水平 + 1  热心指数 + 2  信用等级 + 1   查看全部评分

板凳
jiangbinucf 发表于 2010-8-22 08:29:05
版主真强大,手把手教我们,谢谢!

报纸
夭妖 发表于 2010-8-22 08:41:04
= =~您老好有激情啊~
好久没来~开班上课了啊~
膜拜之~

地板
liuhang1019 在职认证  发表于 2010-8-23 09:09:48
先收藏了~哈哈

7
xiaokanfy 发表于 2010-8-23 12:26:05
爱,数理方面的太难了。。

8
peijiamei 发表于 2010-8-23 14:17:13
该系列很有意义,版主辛苦了!
我的微博:http://t.sina.com.cn/1087192374
欢迎互相加关注!

9
注册吧 发表于 2010-8-23 16:47:53
dingg..............
纸上得来终觉浅,绝知此生要躬行

10
zhaoxiaojun 发表于 2010-8-23 17:33:22
SAS好不好学啊?????

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

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