CAN EXCEL DO IT ?

强大的SAS/GRAPH 到来了,以前的质疑和摇头都可以暂时停一停。

先示一例子,见代码和得到的图形。

data ex;
input day t  h;
cards;
0 2 455
0 4    488
0 4    499
5 8    388
5 9 345
5 9    322
10 16 255
10 15 256
10 15 264
15 20 100
15 22 112
15 21 123
;
run;
proc sgplot;
vbar day / response=t stat=mean limits=both LIMITSTAT=STDERR BARWIDTH=0.4 ;
vline day / response=h stat=mean limits=both LIMITSTAT=STDERR y2axis;
yaxis min=0 max=30 ;
y2axis min=0 max=600 ;
run;

ANOTHER PIC:

自定义中国传统节日函数CNHOLIDAY(beta版)

Functions and CALL Routines

CNHOLIDAY Function

Returns a SAS date value of a Chinese specified traditional holiday for a specified year.

Category:
Date and Time

Syntax

CNHOLIDAY(‘Chinese_holiday’, year)

Arguments
‘Chinese_holiday’

is a character constant, variable, or expression that specifies one of the values listed in the following table.

Values for Chinese holiday can be in uppercase or lowercase

Chinese Traditional Holidays Recognized By SAS NOW

CNHoliday Value Description Date Celebrated
CHUNJIE  春节 正月初一
YUANXIAO  元宵节 正月十五
ERYUEER 二月二 龙抬头 农历二月二
SANYUESAN 三月三 农历三月三
DUANWU  端午节 农历五月五
QIXI  七夕 中国情人节 农历七月七
ZHONGQIU  中秋节 农历八月十五
KONGZI 孔子诞辰日 农历八月二十七
CHONGYANG 重阳节 农历九月九
LABA  腊八节 农历十二月八
ZAOWANG 灶王 农历十二月二十三
XIAONIAN 小年 农历十二月二十四
CHUXI 除夕 农历一年的最后一天

year

is a numeric constant, variable, or expression that specifies a four-digit year.

Range: 1968-2031

Details

The CNHOLIDAY function computes the date on which a specific holiday occurs in a specified year. Only certain Chinese holidays are defined for use with this function (see Chinese Traditional Holidays Recognized By SAS NOW  for a list of valid holidays) (字母拼音相对应的中文节日名也行).

The CNHOLIDAY function returns a SAS date value. To convert the SAS date value to a calendar date, use any valid SAS date format, such as the DATE9. format.

Comparisons

和HOLIDAY函数相比,CNHOLIDAY函数可以返回中国的传统节日。

和函数CNTOG函数相比,CNHOLIDAY函数可以返回相同的结果。

如,CNHOLIDAY(‘CHUNJIE’,2009)或者CNHOLIDAY(‘春节’,2009);返回DNTOG(2009,1,1,0)同样的结果。

Examples

options cmplib=(sasuser.datetr sasuser.cnh);
DATA _NULL_;
Fday= CNHOLIDAY("chuxi",2008);
put  Fday= date9.;
run;

LOG OUTPUT:

Fday=25JAN2009

options cmplib=(sasuser.datetr sasuser.cnh);
DATA _NULL_;
Fday= CNHOLIDAY("除夕",2008);
put  Fday= date9.;
run;

LOG OUTPUT:

Fday=25JAN2009  

See Also

Functions:

DNTOG Function

HOLIDAY Function

自定义SAS函数:将中国农历日期转换成公历日期的函数

Functions and CALL Routines

DNTOG Function


将中国农历日期转换成公历日期

Category: 日期函数 Date


Syntax

DNTOG(NYEAR,NMONTH,NDAY,YUNYUE);

Arguments

NYEAR 中国农历年份,赋值范围:1968-2031

NONTH 中国农历月份,赋值范围:1-12

NDAY 中国农历日期,赋值范围:1-30

YUNYUE 是否农历闰月,赋值范围:0 or1 ,0表示否,1表示是。

Details

Examples

代码示例1,把中国农历日期转化为公历日期

options cmplib=(sasuser.datetr);
proc fcmp;
Gday= dNtoG(1968,7,11,1);
Gday2=dNtoG(1968,7,11,0);
put  Gday= date9.;
put  Gday2= date9.;
run;
quit;

结果:

                                      The FCMP Procedure

Transfered date : 03SEP1968
Transfered date : 04AUG1968
Gday=03SEP1968
Gday2=04AUG1968

代码例2,想知道2009年中国农历春节是哪一天吗?

options cmplib=(sasuser.datetr);
data _null_;
Gday=dNtoG(2009,1,1,0);
put  "2009 Chinese Spring Festival day is " Gday date9.;
put  "GONG XI FA CAI !";
run;

LOG中显示:

Transfered date : 26JAN2009
2009 Chinese Spring Festival day is 26JAN2009
GONG XI FA CAI !

注:如对此函数感兴趣,请邮件索取自定义函数DNTOG()。

用SAS直接解方程

求解方程,在matlab中简直是小菜一碟,并且还提供数值解和解析解,功能很强大。当然,R也不错的功能强大的求解备选软件之一。

以前幻想着SAS里面也可以做得到,曾经在SASor发帖咨询,未果!【当然IML和用类似于C语言一样的算法求解除外,但不具备第四代语言的风格。】

作为号称第四代语言的SAS,现在9.2版本可以做到了:

代码示例:解方程:y=x+x**2,y=25,求x值。

proc fcmp;
      /* define the function */
   function inversesqrt(x);
      return(x+x**2);
   endsub;

   y=25;
   x=solve("inversesqrt", {.}, y, .);
   put x;
run;

最后得到输出值:

4.5249378106

注:1.不可解方程组;2.不可解虚根,一律missing。

如何新建可用于SAS data步中的自定义函数(用C语言)

SAS9.2目前推出了自定义函数的功能。
 
下面介绍怎么用代码实现这一功能:
举一个简单的sample先,函数功能:比较两个数字的大小,函数1返回较大值,函数2返回较小值。
//1,用C编辑器中,编写一段C代码如下,调试并编译通过,用VC把它编译成dll文件,命名为mydll.dll。
int Maxx(int a, int b)
                       {
                           if(a>=b) return a;
                            else
                                         return b;
                          }
int Minx(int a, int b)
                         {
                            if(a>=b) return b;
                           else
                                           return a;
}
 
/*2,SAS编辑器中编写代码,调用外部mydll.dll.*/
/*用PROC PROTO建立SAS函数库sasuser 数据集myfuncs2,函数包mathfun*/
  proc proto package = sasuser.myfuncs2.mathfun
           label = "package of math functions";
                                
   link "D:\sxlion\mydll.dll";
     int Minx(int a , int b) kind=PRICING;
     int Maxx(int a , int b) kind=PRICING;
  run;
 
/*3,   用PROC FCMP 包装 C函数         */
proc fcmp inlib=sasuser.myfuncs2
          outlib=sasuser.myfuncs1.mathfun1;
      /* 建立一个C函数对应的自定义函数 */
   function Maax(a,b);
      x=Maxx(a, b);
      return(x);
   endsub;
quit;
 
/*4. 设定选项,给出函数保存的地方,在DATA步中调用C函数 */
 
options cmplib=(sasuser.myfuncs2 sasuser.myfuncs1);
data _null_;
 a=sas_Maax(11,222);
put a;
run;
quit;
 
/*5 运行结果*/
log:
222
 
小结和说明:上面过程实现了SAS9.2的自定义函数的新功能,并得到相应的结果。但是很明显,Maax()是个山寨函数,和SAS的正牌函数max()相比,当然功能也弱了很多。
 
???怎么样做才能让自己定义的函数达到SAS内置函数的标准???
恐怕还需要很多工作要做。微笑