1、SAS基础编程第三课 SAS编程 第一部分一 SAS 变量的定义/* 直接赋值 */data newvar;a1 = 100; a2 = 1.2e-5; /* 数值型变量的科学表达法 */b = 0100; /* 数值型变量前面的0不起作用 */c = new;d = “NEW” ; /*字符型变量输入时是什么,值就是什么 */f = “ NeW “;name1 = “Toms”;name2 = Toms;date1 = 1jan2006d; /* 直接定义日期 */date2 = 01jan04d;time1 = 9:25t; /* 直接定义时间 */time2 = 9:25:19t;dti
2、me = 18jan2003:9:27:05amdt; /* 定义日期时间 */if begin=01may04:9:30:00dt then end=”31dec90:5:00:00”dt;run;proc print; run;/* 自定义变量 */* 产生一个取值为 1 到 100 的变量 */data int; do i = 1 to 100; /* 此处 do end 为循环语句, i 为循环指标,可取任何符号 */ a = i; output; end;run;proc print; run;/* 简洁版 */data int; do a = 1 to 100; output; e
3、nd;run;proc print; run;/* 通过各种运算定义变量 */SAS 算子 用于比较: = (EQ) 等于, = (NE) 不等于, = (NE) 不等于, (GT)大于, =(GE)大于等于, nights then calendar=Check schedule; else calendar=No problems; if guide=Lucas and nights7 then guide=Torres; if landcost=1500 then price=High ; /* 定义新变量 price */ else if landcost=700 then price
4、=Medium; else price=Low; if events/nights2 then pace=Too fast; else pace=OK; if (city=Paris or city=Rome) and (guide=Lucas or guide=DAmico) then topic=Art history; if landcost gt 1500 or landcost/nights gt 200 then level=Deluxe; if upcase(city)=MADRID then guide=Duncan; /* 使用 upcase 函数 */ if guide 5
5、 then do; weeks = 3 + year/5; group = Qualified; end; /* 这里 do end 不是循环语句,是大括号 */ else do; yrsleft = 5 - years; group = Not Qualified; end;run;proc print; run;/* Investment data */data investment; begin=01JAN1990d; end=31DEC2009d; capital = 0; do year=year(begin) to year(end); /* 函数 year 给出时间变量中的年的值
6、 */ capital = Capital + 2000 + .07*(Capital+2000); output; end; put The number of DATA step iterations is _n_; run; proc print data=investment; format Capital dollar12.2; run;data investment; begin=01JAN1990d; end=31DEC2009d; do year=year(begin) to year(end); Capital + 2000 + .07*(Capital+2000); /*
7、自动给出初值和更新变量值 */ output; end; put The number of DATA step iterations is _n_; run; proc print data=investment; format Capital dollar12.2; run;/* another example */ data a;input x;datalines;50002500;run;data b;set a;a = normal(0); /* normal 函数产生一个正态随机数,0 表示取现在的时间作为 seed */exit=10;do i=1 to exit;y=x*nor
8、mal(0);if y25 then i=exit;output;end;run;proc print; run;三SAS的分组 - By语句/* by 语句的定义 */data zipcodes; input state $ 1-2 city $5-14 street $15-25 zipcode 30-34; cards;AZ Tucson Domenic Ln 85730FL Miami Trade Ave 33133FL Miami Thomas Ave 33133FL Lakeland French Ave 33801FL Miami Nervia St 33146AZ Tucson
9、 Gleeson Pl 85730FL Miami Rice st 33133FL Miami Corsica St 33146FL Lakeland Egret Dr 33809FL Miami Surrey Dr 33133;run;proc print; run;/* 将同一个州的观测值放一起, by 语句的变量为 state */proc sort data = zipcodes out=state; by state; run;proc print; run;/* 进一步将州内的城市排序, by 语句的变量为 state city*/proc sort data = zipcodes
10、 out=city; by state city; run;proc print; run;/* 所以变量都排序, by 语句的变量为 state city zipcode street */proc sort data = zipcodes out=city; by state city zipcode street; run;proc print; var state city zipcode street; run;/* 将 state 按逆序排列 */proc sort data = zipcodes out=city; by descending state city zipcode
11、 street; run;proc print; var state city zipcode street; run;/* 将 state 和 city 都按逆序排列 */proc sort data = zipcodes out=city; by descending state descending city zipcode street; run;proc print; var state city zipcode street; run;/* 将数据按 zipcode 分组打印 */proc print; var state city zipcode street; by state
12、 city zipcode; run;/* proc sort 的另一个选项 */data dupobs; input country $ 1-11 tourtype $ 13-24 nights landcost vendor $; cards; Spain architecture 10 510 World Japan architecture 8 720 Express Switzerland scenery 9 734 World Switzerland scenery 9 734 World France architecture 8 575 World Ireland scener
13、y 7 558 Express New Zealand scenery 16 1489 Southsea Italy architecture 8 468 Express Greece scenery 12 698 Express ; run; proc print data=dupobs; title Data Set DUPOBS; run; proc sort data=dupobs out=fixed noduplicates; by country; run; proc print data=fixed; title Removing a Duplicate Observation
14、with PROC SORT; run; /* 确定由 by 语句定义的组的边界 */* 当使用 proc sort, 系统会自动生成 first.varible 和 last.variable */proc sort data=zipcodes; by state city; run;data _null_; /* 不生成数据,但使用 data step */set zipcodes;by state city;if _N_=1 then put Grouped by state city; /* 将信息写到 log 窗口 */put;put _N_= state= city= first.
15、state= last.state= first.city= last.city= ;put; /* 打一个空行 */run;/* 计算每组的工资和 */data salaries;input Department $ Name $ WageCategory $ WageRate;datalines;BAD Carol Salaried 20000BAD Elizabeth Salaried 5000BAD Linda Salaried 7000BAD Thomas Salaried 9000BAD Lynne Hourly 230DDG Jason Hourly 200DDG Paul Sa
16、laried 4000PPD Kevin Salaried 5500PPD Amber Hourly 150PPD Tina Salaried 13000STD Helen Hourly 200STD Jim Salaried 8000;proc print data=salaries; run;proc sort data=salaries out=temp; by Department; run;data budget (keep=Department yearlywage Payroll);set temp;by Department;retain payroll; if WageCat
17、egory=Salaried then YearlyWage=WageRate*12;else if WageCategory=Hourly then YearlyWage=WageRate*2000;/*SAS sets FIRST.variable to 1 if this is a new department in the BY group*/if first.Department then Payroll=0; payroll = payroll + YearlyWage;/*SAS sets LAST.variable to 1 if this is the last depart
18、ment in the BY group*/* if last.Department; */ /* 只需取一组中最后一个观测值 */run;proc print data=budget;format Payroll dollar10.;title “Annual Payroll by Department”;run;/* 求身高的平方和 */DATA DEMO; INPUT GENDER $ HEIGHT WEIGHT AGE;DATALINES;M 68 155 23F 61 99 20F 63 115 21M 70 205 45M 69 170 .F 65 125 30M 72 220 4
19、8;Run;PROC PRINT; RUN:data a; set DEMO end = done; /* done 是一个指示变量,对最后一个观测值为 1,其他为 0 */ retain N sum 0; N = N + 1; Sum = sum + height*2; if done then do;mean = sum/N; output; end;run;proc print; run;data donkey; input year 1-4 pres $ 6-29 vicepres $ 31-55 result $ 60-64; cards; 1920 James M. Cox Fra
20、nklin D. Roosevelt lost 1924 John W. Davis Charles W. Bryan lost 1928 Alfred E. Smith Joseph T. Robinson lost 1932 Franklin D. Roosevelt John N. Garner won 1936 Franklin D. Roosevelt John N. Garner won 1940 Franklin D. Roosevelt Henry A. Wallace won 1944 Franklin D. Roosevelt Harry S. Truman won 1948 Harry S. Truman Alben W. Barkley won 1952 Adlai E. Stevenson John J. Sparkman lost 1956 Adlai E. Stevenson Estes Kefauver l
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1