全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5612 12
2010-08-22
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;
二维码

扫码加我 拉你入群

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

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

全部回复
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=;
二维码

扫码加我 拉你入群

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

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

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个值。
二维码

扫码加我 拉你入群

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

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

2010-8-22 08:29:05
版主真强大,手把手教我们,谢谢!
二维码

扫码加我 拉你入群

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

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

2010-8-22 08:41:04
= =~您老好有激情啊~
好久没来~开班上课了啊~
膜拜之~
二维码

扫码加我 拉你入群

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

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

2010-8-23 09:09:48
先收藏了~哈哈
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群