楼主: crackman
7610 24

跟crackman读SAS程序(34-50) [推广有奖]

已卖:401份资源

院士

83%

还不是VIP/贵宾

-

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

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

楼主
crackman 发表于 2010-8-31 17:50:03 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
跟crackman读SAS程序(34)---迭代计算变量乘积
data a;
   input x1-x5;
datalines;
1 2 3 4 5
2 3 4 5 6
4 5 6 7 8
;
data b;
   set a;
   array test(5) x1-x5;
   do i=1 to dim(test)-1; /*注意这里面的减一*/
if i=1 then prod=test(i); /*注意如果第一个数字,那么就为起始*/
prod=prod*test(i+1); /*迭代*/
   end;
   drop i;
run;
proc print;
run;
注意学习的地方就是迭代

Obs x1 x2 x3 x4 x5 prod

1    1     2     3     4     5     120
2    2     3     4     5     6     720
3    4     5     6     7     8 6720
二维码

扫码加我 拉你入群

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

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

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

已有 3 人评分学术水平 热心指数 信用等级 收起 理由
anzhiliang + 1 + 1 + 1 对论坛有贡献
happy_287422301 + 2 对论坛有贡献
peijiamei + 4 + 3 对论坛有贡献

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

沙发
crackman 发表于 2010-8-31 17:51:25
跟crackman读SAS程序(35)----根据FIRST.VAR和LAST.VAR来输出有无重复观测的数据集
data clasdata ;
input id name $ class $ ;
datalines;
4567 Denise ENGL201
4567 Denise ENGL201
1234 Lynn CHEM101
1234 Lynn CHEM101
1234 Lynn MATH102
5678 Rick CHEM101
5678 Rick HIST300
5678 Rick HIST300
3456 Amber CHEM101
3456 Amber Math102
3456 Amber Math102
2345 Ginny CHEM101
2345 Ginny ENGL201
2345 Ginny MATH102
;
proc sort ;
by name class ;
run;
data dups nodups ;
set clasdata ;
by name class ;                        
if first.class and last.class then output nodups ; /*FIRST.CLASS和LAST.CLASS同时为1的时候就输出*/
else output dups ;
run;
proc print data=dups;
title 'RESULTS of DUPS data set';
run;
proc print data=nodups;
title 'RESULTS of NODUPS data set';
run;
注意:我们知道,如果有重复观测对象出现,那么FIRST.CLASS应该是1 0 0 0 0 1(下一组的开始),那么LAST.CLASS则是0 0 0 0 1 0(下一组的开始)
如果没有重复观测对象的话,那么FIRST.CLASS为1 1(下一组开始) LAST.CLASS为1 0(下一组开始) 所以同时为1,确定了唯一性。

藤椅
crackman 发表于 2010-8-31 17:51:59
跟crackman读SAS程序(36)--CMISS与NMISS函数的差别
data survey;

    input id diet exer hours xwk $ educ $;

    total_miss=nmiss(diet,exer,hours)+cmiss(xwk,educ);

datalines;

1 1 . 1 3 1

1 . 2 1 4 2

1 . 4 . . .

1 1 5 2 3 .

2 . 9 2 3 .

2 5 9 2 4 .

2 . 3 . 5 3

3 2 . . . .

;


如果不要后面的CMISS也可以得出需要的结果

但是CMISS与NMISS的却别是什么呢

看看下面的程序:

data survey;

    input id diet exer hours xwk $ educ $;

    total_miss=nmiss(diet,exer,hours,xwk,educ);

datalines;

1 1 . 1 A .

1 . 2 1 4 2

1 . 4 . . .

1 1 5 2 3 .

2 . 9 2 3 .

2 5 9 2 4 .

2 . 3 . 5 3

3 2 . . . .

;

结果是不一样的

在SAS 官方网站说明如下:

argument
specifies a constant, variable, or expression. Argument can be either a character value or a numeric value.

Details



A character expression is counted as missing if it evaluates to a string that contains all blanks or has a length of zero.

A numeric expression is counted as missing if it evaluates to a numeric missing value: ., ._, .A, ... , .Z.



Comparisons



The CMISS function does not convert any argument. The NMISS function converts all arguments to numeric values.

CMISS在计算缺失值的时候,不会对参数进行转换,而NMISS则会把所有的参数转换为数值然后来计算缺失值。

板凳
crackman 发表于 2010-8-31 17:52:29
跟crackman读SAS程序(37)----SQL LEFTJOIN
data a;
input   m id;
cards;
2 302783
2 303159
1 303163
4 303190
1 303209
1 303225
2 303306
1 302468
2 302866
1 302978
2 303189
2 303189
2 303495
1 302680
2 302704
2 302729
2 302918
1 303159
2 303172
2 303263
3 303407
2 302859
1 302868
2 302880
1 303014
1 303051
2 303109
2 303146
2 303219
2 303232
1 303235
1 302805
2 303036
2 303157
2 303179
2 303189
2 302293
1 302342
2 302509
2 302931
2 303230
1 302842
2 302895
1 302932
1 303005
2 303032
1 303036
1 303123
1 303251
1 303379
4 302197
1 302905
1 303095
4 302688
2 302911
2 302941
2 302983
1 302995
1 303021
2 303025
1 303222
;
data b;
input m id;
cards;
2 303481
1 303349
2 321002
2 303430
4 303553
1 303389
1 313001
1 313001
2 303406
1 328003
4 303263
1 302276
2 303678
2 302631
1 303034
2 316007
1 303658
2 302770
2 303665
2 303680
2 314000
2 302867
2 328005
2 302008
2 303699
2 321005
2 321019
1 303432
1 303523
2 303199
2 303519
;
proc sql;
create table c as
       select a.*,
            case b.h
                   when 1 then 1
                   else 0
            end as h
         from a left join (select distinct id, 1 as h from b) b
            on a.id=b.id;
quit;
这里学习的地方:
1.将一个查询结果直接作为再次查询的数据集,例如 (select distinct id, 1 as h from b) b
2.H作为指示变量

报纸
crackman 发表于 2010-8-31 17:52:53
跟crackman读SAS程序(38)---ORDER BY 的作用
data raw;
input ID $ VAR;
cards;
001 80
001 20
001 30
001 12
001 43
001 62
002 40
002 25
002 60
002 32
002 62
002 34
002 68
003 10
003 75
003 20
003 19
003 72
003 12
003 20
003 15
;
proc univariate data=raw noprint;
var var;
class id;
output out=temp pctlpts=25 50 75 pctlpre=p;
run;
proc sql;
create table out as
   select   a.*,
         case
            when var le p25 then 1
            when p25 lt var le p50 then 2
            when p50 lt var le p75 then 3
            when p75 le var then 4
            else .
         end as TYPE
      from raw a,temp b
      where a.id=b.id
      order by a.id,var; /*这里面包括GROUP分组逐步来CASE WHEN*/
quit;
/*其实这里学习的应该是ORDER BY */

地板
crackman 发表于 2010-8-31 17:53:16
跟crackman读SAS程序(39)---NOTDIGIT函数 的作用
data raw;
   infile datalines truncover;
   input x $ y;
datalines;
a 1
2
3
b 1
2
3
;
data temp(drop=temp);
   retain temp;
   set raw;
   if notdigit(x)=1 then temp=x;
   else do;
         y=input(x,8.);
         x=temp;
      end;
run;其实这个程序有其他程序的风格还是一个中间变量TEMP以及NOTDIGIT函数的对是否为数值型变量的判断。data _null_;
   string='Next = _n_ + 12E3;';
   j=0;
   do until(j=0);    k=j+1;
      j=notdigit(string,k);
      if j=0 then put +3 "That's all";
      else do;
         c=substr(string,j,1);
         put +3 j= c=;
      end;    j+1;
   end;
run;

7
crackman 发表于 2010-8-31 17:53:50
跟crackman读SAS程序(40)---根据条件给宏变量赋值函数
%let val=0;                                                                                                                                 
   %let var=%sysfunc(ifc(&val=1,one,zero));                                                                                                  
   %put &var; 就是在SYSFUNC里面调用IFC函数IFC函数,根据逻辑表达式的结果来给VAR赋值
等同于下面程序:%macro test(val);                                                                                                                           
     %if &val=1 %then %let var=one;                                                                                                            
     %else %let var=zero;                                                                                                                       
     %put &var;                                                                                                                                 
   %mend;                                                                                                                                       
                                                                                                                                             
   %test(0)

8
crackman 发表于 2010-8-31 17:54:15
跟crackman读SAS程序(41)---时间数据的读入格式+按照季度来排序

data crackman;
input dt ddmmyy.;
q=put(dt,yyq6.);
datalines;
010203
020103
040504
040504
080602
090810
;
run;
proc sort data=crackman;
by q;
run;


本程序主要学习的几点:

1.时间日期的格式

DATEW. 1JAN2010   01AUG10 1-AUG-2010

DATETIMEW. 01AUG10:10:23:10.9

DDMMYYW. 080808 09/09/09 07-08-09 08 07 06

JULIANW. 0807

MMDDYYW. 08-06-07 050610   12/06/10

YYQW. 09Q1

2.按照季度来序

9
crackman 发表于 2010-8-31 17:54:39
跟crackman读SAS程序(42)-MERGE输出不交叉的观测对象

data one;
input x;
datalines;
1
2
3
4
5
6;
run;
data two;
input x;
datalines;
1
3
6
7
8
9
;
run;
data crackman;
merge one(in=a) two(in=b);
by x;
if not(a and b);
run;
其实关键是学习NOT(A AND B)这个条件判断方式

10
crackman 发表于 2010-8-31 17:55:15
跟crackman读SAS程序(43)-打印某个文件目录下的所有指定格式的SAS数据集



options mprint;
%macro drive(dir);
%let filrf=mydir; /*创建一个宏变量*/
%let librf=temp;
%let lib=%sysfunc(libname(&librf,&dir)); /*通过函数LIBNAME建立数据集*/
%let rc=%sysfunc(filename(&filrf,&dir)); /*建立FILENAME文件名*/
%let did=%sysfunc(dopen(&filrf)); /*打开要读取的文件目录*/

/* 返回该文件目录下的文件的个数 */
%let memcnt=%sysfunc(dnum(&did));
%let cnt=0;
%do i = 1 %to &memcnt;
/*获得文件的扩展名 */
%let lname=%qupcase(%qscan(%sysfunc(dread(&did,&i)),2,.));

/* 获得文件的名字(除去扩展名) */
%let fname=%qscan(%qsysfunc(dread(&did,&i)),1,.);

/*确定是不是扩展名为SAS7BDAT格式*/
%if %upcase(&lname) = SAS7BDAT %then %do;
   proc print data=&librf..&fname;
   run;
%end;
%end;
/*关于该文件目录*/
%let rc=%sysfunc(dclose(&did));
%mend drive;
%drive(C:\Documents and Settings\Administrator\My Documents\My SAS Files)



下面是转载的一篇日志:

%MACRO importFile(dirName=c:\abc\, dsout=DSOUT);
%PUT %STR(----------->dirName=&dirName) ;
data fileList                                       ;
rc=filename("DIR","&dirName") ;/*把&DIRNAME值传给文件引用符“DIR"*/
openFile=dOpen("DIR") ;/*得到路径标示符OPENFILE,DOPEN是打开directory的sas函数*/
if openFile>0 then do ;/*如果OPENFILE>0表示正确打开路径*/
num=dNum(OPENFILE)    ;/*得到路径标示符OPENFILE中member的个数num*/
do i=1 to num        ;
name=dRead(openFile,i) ;/*用DREAD依次读取每个文件的名字到NAME*/
if index(upcase(name),"MTH")^=0 then output;
end ;
end ;
keep name ;/*只保留NAME列*/
run;

/*把文件名存为依次编号的宏变量*/
data _NULL_;set fileList end=L;
call symput( cat("file",_N_),name);
if L then call symput("nobs",_N_);
run;

/*准备一个空的数据文件*/
data &dsout;run;

/*依次读入数据文件---> tmp*/
%do _i=1 %to &nobs;
%let tmpFile=&&file&_i;
data tmp;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile "&dirName.&tmpFile" TRUNCOVER lrecl=63 ;
format mthdate yymmdd8. ;
format stkno $6. ;
format buysell $1. ;
format excd $1. ;
format mthtimee $8.;
format recno $8. ;
format odrno $5. ;
format mthpr 7.2 ;
format mthshr best9. ;
format mthprt $4. ;
format odrtpe $1. ;
format mark $1. ;
format brkid $4. ;
format mthtime time11.2;
format mthdatetime datetime20.2;
label mthdate="成交日期";
label stkno="股票代码";
label buysell="买卖别";
label excd="交易会种类代码";
label mthtimee="成交时间";
label recno="成交序号";
label odrno="成交及委托连结代码一";
label mthpr="成交价格";
label mthshr="成交股数";
label mthprt="成交回报印表机";
label odrtpe="委托种类代号";
label mark="投资人类别";
label brkid="成交及委托连结代码二";
label mthtime="成交时间";
label mthdatetime="成交的日期时间";
input
@1 mthdate yymmdd8.
@9 stkno $6.
@15 buysell $1.
@16 excd $1.
@17 mthtimee $8.
@25 recno $8.
@33 odrno $5.
@38 mthpr 7.2
@45 mthshr 9.
@54 mthprt $4.
@58 odrtpe $1.
@59 mark $1.
@60 brkid $4.
;

hh1=substr(mthtimee,1,2);
mm1=substr(mthtimee,3,2);
ss11=substr(mthtimee,5,2);
ss12=substr(mthtimee,7,2);
ss1=ss11!!"."!!ss12;
hh=input(hh1,2.);
mm=input(mm1,2.);
ss=input(ss1,4.2);
mthtime=hms(hh,mm,ss);
mthdatetime=dhms(mthdate,hh,mm,ss);
drop mthtimee hh1 mm1 ss11 ss12 ss1 hh mm ss;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */
run;

/*每个数据文件 ---> &dsout*/
data &dsout;set &dsout tmp;
run;

%end;
%mend importFile;
%importFile(dirName=c:\, dsout=ccc)

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

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