全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2010-8-25 14:55:15
留个脚印 学习
二维码

扫码加我 拉你入群

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

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

2010-8-25 15:10:41

跟crackman读SAS程序(26)

title "This is title 1" ;
data one;
  do i=1 to 10;
    output;
  end;
run;
proc print; run;
title2 "This is title 2";
title3 "This is title 3";
data two;
  do j=1 to 5;
   output;
  end;
run;
proc print; run;

proc sql noprint;
  select TEXT into : MYTITLES separated by ", "
  from SASHELP.VTITLE
  where NUMBER in (1,2,3);
quit;

%put &mytitles;

这里学习的是
1.SASHELP.VTITLE存储是数据集中的TITLE的文本对象
2.SQL中与宏的结合使用,将在SASHELP.VTITLE查询结果赋值给宏变量 MYTITLES 。
二维码

扫码加我 拉你入群

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

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

2010-8-25 15:18:50
不错不错~~我有个问题想请教~谢谢!
在宏里用in这个运算符时为什么可以不用“()”括号?
设置了minoperator这个选项后就可以用in了,那我能这样类推吗,比如设置了mmeanoperator,就可以在宏里用mean?
二维码

扫码加我 拉你入群

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

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

2010-8-25 15:28:00
楼上的想法非常好
你可以去试一下
看看行不行
二维码

扫码加我 拉你入群

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

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

2010-8-25 15:35:12

跟crackman读SAS程序(27)-学会COUNTW计算字符串中的Word数量

%let string = blue red green;
%let word_cnt=%sysfunc(countw(&string));
%put There are &word_cnt words in the string "&string";
注意是在9.1以上版本使用哦
二维码

扫码加我 拉你入群

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

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

2010-8-25 15:38:47
我用的是9.1,没法试~~斑竹是从哪里学到的?
二维码

扫码加我 拉你入群

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

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

2010-8-25 15:55:28

跟crackman读SAS程序(28)--DATA SET中IN的使用

data one;
  input string $;
datalines;
apple
banana
coconut
;
data two;
  input string $;
datalines;
anagram
bottle
clown
dog
;
data combo;
  set one(in=o) two(in=t);
  if o then origin='one';
  else origin='two';
run;
proc print data=combo;
run;

其实这里用了IN这个参数来表示在SET过程中,观测对象的来源,根据IN参数的值来判断并赋予不同的值。
结果:
                                                         SAS 系统               

                                                 Obs    string     origin
                                                  1     apple       one
                                                  2     banana      one
                                                  3     coconut     one
                                                  4     anagram     two
                                                  5     bottle      two
                                                  6     clown       two
                                                  7     dog         two
二维码

扫码加我 拉你入群

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

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

2010-8-25 20:34:41

跟crackman读SAS程序(29)--FCMP构建计算年龄的函数

proc fcmp outlib=work.functions.samples; /*SAS_AGE自定义的功能函数存放的地方*/
function sas_age(Birthday,Current); /*函数的两个参数*/
   age=int(intck('month',birthday,current)/12); /*用INTCK计算AGE*/
   if month(birthday)=month(current) then
      age = age-(day(birthday)>day(current)); /*如果月份一样,如果生日的天数大于当前的天数,那么返回1,否则是0*/
   return(age); /*输出AGE这个结果,也就是函数的返回值吧*/
endsub;
run;
options cmplib=work.functions; /*注意要加上这个OPTIONS*/
data birth;
  input name $ bday :mmddyy10.;
datalines;
Miguel      12/31/1973
Joe         02/28/1976
Rutger      03/29/1976
Broguen     03/01/1976
Susan       12/12/1976
Michael     02/14/1971
LeCe        11/09/1967
Hans        07/02/1955
Lou         07/30/1960
;
run;
                                                         
data ages;
  set birth;
  retain current;
  if _n_=1 then current=today();
  format bday current worddate20.;
  actualage=sas_age(bday,current);
run;
这个FCMP过程给了我们很多可以自定义函数的空间,大大扩充SAS函数的自定义,值得学习
二维码

扫码加我 拉你入群

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

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

2010-8-25 22:00:18

跟crackman读SAS程序(30)--DATA步里面实现不同数据集的观测对象的组合

data one;                  
  input id $ fruit $;      
datalines;                 
a apple                    
a apple                    
b banana                  
c coconut                  
c coconut                  
c coconut                  
;                                                   
data two;                  
  input id $ color $;      
datalines;                 
a amber                    
b brown                    
b black                    
c cocoa                    
c cream                    
;               
data every_combination;
  /* 一般第一个SET的数据集应该是较大、数据观测、变量较多的数据集 */
  set one;
  do i=1 to n;
  /*对于每一个ONE里面的观测,都与TWO里面的每一个观测进行循环组合*/
    set two point=i nobs=n;
    output;
  end;
run;
proc print data=every_combination;
run;
这个程序给交叉组合提供了一个不需要SQL的另外一个方法,用的是SET机制
二维码

扫码加我 拉你入群

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

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

2010-8-25 22:11:02
SAS 系统               2010年08月25日 星期三 下午08时27分19秒  11

                                              Obs    id     fruit     color

                                                1    a     apple      amber
                                                2    b     apple      brown
                                                3    b     apple      black
                                                4    c     apple      cocoa
                                                5    c     apple      cream
                                                6    a     apple      amber
                                                7    b     apple      brown
                                                8    b     apple      black
                                                9    c     apple      cocoa
                                               10    c     apple      cream
                                               11    a     banana     amber
                                               12    b     banana     brown
                                               13    b     banana     black
                                               14    c     banana     cocoa
                                               15    c     banana     cream
                                               16    a     coconut    amber
                                               17    b     coconut    brown
                                               18    b     coconut    black
                                               19    c     coconut    cocoa
                                               20    c     coconut    cream
                                               21    a     coconut    amber
                                               22    b     coconut    brown
                                               23    b     coconut    black
                                               24    c     coconut    cocoa
                                               25    c     coconut    cream
                                               26    a     coconut    amber
                                               27    b     coconut    brown
                                               28    b     coconut    black
                                               29    c     coconut    cocoa
                                               30    c     coconut    cream
二维码

扫码加我 拉你入群

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

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

2010-8-25 22:47:49
是有很多种方法
不过这种方法也让我开眼界了,Thanks
二维码

扫码加我 拉你入群

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

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

2010-8-25 22:49:32

跟crackman读SAS程序(31)---如何动态的命名输出变量的名字

title;                                                               
/*获得数据集SASHELP.CLASS中的变量名的名字以及类型,1=数值型 2=字符型*/                                                                  
proc contents data=sashelp.class out=stuff(keep=name type) noprint;  
run;                                                                 
                                                                     
data temp;                                                           
  set stuff;                                                         
  length sumname $14.;                                               
  sumname=cats(name,'_total');   /*给每一个变量名字添加后缀_total,以示区别初始变量的名字*/                                    
run;                                                                 
                                                                     
/* look at new name */                                               
                                                                     
proc print data=temp;                                                
  title 'temp';                                                      
run;                                                                 
title;                                                               
                                                                     
/* create macro var with list of numeric variable names */           
                                                                     
proc sql;                                                            
  select (sumname)                                                   
  into :outname separated by ' '  /*将添加后缀和原始变量的名字一次赋值给宏变量*/                                   
  from temp                                                         
  where type = 1;                                                   
  select (name)                                                      
  into :inname separated by ' '                                      
  from temp                                                         
  where type = 1;                                                   
quit;                                                               
                                                                     
proc means data=sashelp.class;                                       
  var &inname;                                                      
  output out=mymeans sum= &outname;   /*计算每一个变量的汇总*/                              
run;                                                                                                                                    
proc print data=mymeans;                                             
  title 'mymeans';                                                   
run;                                                                 
      
值得学习:
1.CONTENTS使用,获得变量,变量的类型
2.SQL中的宏使用
二维码

扫码加我 拉你入群

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

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

2010-8-25 22:50:16
temp                 2010年08月25日 星期三 下午08时27分19秒  33

                                          Obs    NAME      TYPE      sumname

                                           1     Age         1     Age_total
                                           2     Height      1     Height_total
                                           3     Name        2     Name_total
                                           4     Sex         2     Sex_total
                                           5     Weight      1     Weight_total

                                                                                2010年08月25日 星期三 下午08时27分19秒  34

                                                      sumname
                                                      --------------
                                                      Age_total
                                                      Height_total
                                                      Weight_total

                                                                                2010年08月25日 星期三 下午08时27分19秒  35

                                             变量名称
                                             --------------------------------
                                             Age
                                             Height
                                             Weight

                                                                                2010年08月25日 星期三 下午08时27分19秒  36

                                                     MEANS PROCEDURE

               变量      标签             N            均值          标准差          最小值          最大值
               --------------------------------------------------------------------------------------------
               Age       年龄            19      13.3157895       1.4926722      11.0000000      16.0000000
               Height    身高(英寸)    19      62.3368421       5.1270752      51.3000000      72.0000000
               Weight    体重(磅)      19     100.0263158      22.7739335      50.5000000     150.0000000
               --------------------------------------------------------------------------------------------

                                                         mymeans                2010年08月25日 星期三 下午08时27分19秒  37

                                                              Age_    Height_    Weight_
                                  Obs    _TYPE_    _FREQ_    total     total      total

                                   1        0        19       253      1184.4     1900.5
二维码

扫码加我 拉你入群

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

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

2010-8-25 23:17:21

跟crackman读SAS程序(32)---INDSNAME获得SET数据集观测的不同来源

data one;
x=1;
run;

data two;
y=2;
run;

data new;
  set one(in=ina) two(in=inb);
  if ina then dsetname='WORK.ONE';
  else dsetname='WORK.TWO';
proc print;
run;

这个程序和下面的这个程序比较看看差别,体会一下新参数的特点
data one;
  x=1;
n=2;
run;

data two;
  y=2;
  m=3;
run;

data new;
  set one two indsname=dsn;
  dsetname=dsn;
run;
这里INDSNAME选项是为了记录读入数据的原数据集的名称,但是默认条件下INDSNAME是不会写入到输出的数据集中,所以需要设一个新的变量来保存INDSNAME的结果。

结果和第一个程序一样,不过后面的程序是9.2里面的一个新技巧
二维码

扫码加我 拉你入群

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

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

2010-8-26 10:08:16
请教一个问题:
程序的倒数第9行, %return;  的作用是什么?变量不符合条件,为什么要返回,返回到哪里? 谢谢!
二维码

扫码加我 拉你入群

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

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

2010-8-26 10:18:30
crackman 发表于 2010-8-24 10:48
%let x=100;
%let a=200;
%macro putsorted(class);                                                                                                               
                                                            
                                                        
   %let cls = %upcase(&class);                                                                                                         
   proc sql;                                                                                                                           
      create view new as select * from sashelp.vmacro                                                                                   
   %if "&cls" eq "_AUTOMATIC_" %THEN                                                                                                   
      where scope='AUTOMATIC';                                                                                                         
   %else %if "&cls" eq "_GLOBAL_" %then                                                                                                
      where scope='GLOBAL';                                                                                                            
   %else %if "&cls" eq "_LOCAL_" %then                                                                                                  
      where scope^='AUTOMATIC' and scope^='GLOBAL' and scope^='PUTSORTED';                                                              
   %else %if "&cls" eq "_USER_" %then                                                                                                   
      where scope^='AUTOMATIC' and scope^='PUTSORTED';                                                                                 
   %else %if "&cls" eq "_ALL_" %then                                                                                                   
      where scope^='PUTSORTED';                                                                                                         
   %else %do;                                                                                                                           
      %put Unrecognized CLASS of macro variables: &cls;                                                                                 
      %return;                                                                                                                          
   %end;                                                                                                                                
      order by name;                                                                                                                    
   quit;                                                                                                                                
   data _null_;                                                                                                                        
      set new;                                                                                                                          
      put scope +1 name +1 value;                                                                                                      
   run;                                                                                                                                 
%mend;                                                                                                                                 
                                                                                                                                       
%putsorted(_global_)
其实这个里面值得学习的一点就是在宏里面用SQL根据IF  THEN ELSE判断不同的筛选条件来获得不同作用范围的宏变量按照字母顺序输出
请教一个问题:
程序的倒数第9行, %return;  的作用是什么?变量不符合条件,为什么要返回,返回到哪里? 谢谢!
二维码

扫码加我 拉你入群

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

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

2010-8-26 11:30:25
%return
主要是用来终止当前正在执行的宏程序
The %RETURN macro causes normal termination of the currently executing macro.
二维码

扫码加我 拉你入群

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

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

2013-12-3 16:24:19
斑竹好无私,赞一个
二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

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