小白学SAS 第一,二章节
2022-04-06 11:41:01 0 举报
AI智能生成
登录查看完整内容
小白学SAS
作者其他创作
大纲/内容
起名:英文、数字和下划线
data 数据集名
input 变量1 变量2 ...;
cards;数据;
data first;input gender age;cards;1 300 24;
-first为永久数据集在sasuser里-data sasuser.first;input gender age;cards;1 300 24;
-在SAS逻辑库里建立一个名为“fgs”的文件夹,并将它与电脑上的“g:\\excel”文件夹关联起来-libname fgs \"g:\\excel\";
-把first数据集添加到fgs文件夹中-data fgs.first;input gender sge;cards;1 300 24;
-在G盘EXCEL文件夹中生成一个名为FIRST的SAS数据集-data \"g:\\excel\\first\";input gender age;cards;1 300 24;
-对于自己建立的逻辑库,在调用前需要用libname语句把逻辑库与文件夹建立关联-libname fgs \"g:\\excel\";proc print data=fgs.first;run;
-如果用data\"g:\\excel\\first\";语句建立永久数据集的调用程序-proc print data=\"g:\\excel\\first\";run;
注释格式为:/*注释*/
1.初识SAS
data fh;input x 4.2; /*变量后4.2表示变量x的宽度共4位,其中小数有2位*/cards;122.115.623.46;proc print; /*这句话的作用是让读入的数据显示在输出窗口*/run;
SAS变量:字符型和数值型input 变量1 输入格式1 变量2 输入格式2 ...;数值型的输入格式:w.d(w表示数值的总位数或宽度,包括小数点;d表示数值的小数部分的位数,即使没有小数,点号也要加上)
data fh;input pro $12.;cards;山东省青岛市;proc print;run;
字符型的输入格式:$w.(其中$符号是必须加的,w表示字节数,1各种问占2个字节,SAS默认对字符只读取8位)
如果年月日之间没有任何分隔符,此时SAS要求输入的月和日都是2位
日期型变量的输入格式
data fh;input city:$18. zone$; /*在city后加了一个冒号*/cards;山东省蓬莱市 0536山东省青岛市市南区 0532;proc print;run;
1.一旦对变量指定了宽度,SAS就按指定的宽度来读取变量。2.如果指定了宽度,SAS就忽略空格的作用,而是把包括空格在内的所有字符都作为变量的值。3.不过要记住,日期型变量的宽度最大不能超过32。4.如果有超过2个以上的变量指定了宽度,最好都用冒号结合一个的宽度值得方式来输入。
data fh;input day1: yymmdd10. day2: yymmdd10.; /*在day1后加了一个冒号*/cards;130125 20130528;proc print;run;
冒号:的作用是告诉SAS,如果要读取下一个变量,需要满足下面任一条件:要么遇到空格,要么变量的宽度读完。(一旦对变量指定了宽度,SAS就不再以默认的空格作为区分的标志了,而是按指定的宽度来识别变量。)
data fh;input name&:$50. city&:$50.;cards;Peter Parker 山东省 蓬莱市Ross Geller 山东省 青岛市 市南区;proc print;run;
&符号的作用:变量值包含空格的情况下使用(当变量本身就有空格是时,变量之间就需要2个或2个以上的空格隔开,这样SAS就会把这2个或2个以上的空格作为变量分隔符)
两个特殊输入符-:和&
SAS变量的输入格式
data wt;input num cost prop;format num 5.2 cost comma12.1 prop percent8.2;cards;50 10205600 0.123645 9580000 0.0361;proc print;run;
指定输入格式会改变变量的值,而指定输出格式不会改变变量的值,只会改变它们的样子。inputformat 变量1 格式1 变量2 格式2 ...;cards数值型变量常用的输出格式:3种w.dcommaw.d(将数值的整数部分自右向左每三位用逗号隔开)percentw.d(将数值显示位百分比的形式,%占3个字节)
data fs;input x$ y$2.;format x$2.;x1=x+1;y1=y+1;cards;1100 1100;proc print;run;
字符型的输出格式:与输入格式一样也是$w.
data dat;input date1:yymmdd10. date2:yymmdd10. date3:yymmdd10.;format date1 yymmdd10. date2 yymmdds8. date3 yymmddp8.;cards;13.06.16 130616 20130616;proc print;run;
日期型变量的输出格式
SAS变量的输出格式
proc format;invalue <$>格式名 变量值或范围1=输入格式1...; /*如果定义的输入格式是字符,需要在格式名前加$*/value <$>格式名 变量值或范围1=输出格式1...;/*如果变量值或范围是字符,需要在格式名前加上$*/picture 模板名<数值范围>;
proc formate要写在data语句前
grade 本身值1~4都只有1位宽度,但是指定的输入格式,真正读取的是Freshman、Sophomore等,所以需要grade:$grade20.value需要用format语句将变量score和输出格式fscore关联起来。proc format是个过程,format是个语句,只是把变量与某种输出格式关联起来,让变量按照这种格式输出。
proc format;invalue $grade 1=\"Freshman\" 2=\"Sophmore\" 3=\"Junior\" 4=\"Senior\";value fscore low-<60=\"不及格\" 60-<80=\"及格\" 80-high=\"优秀\";data grade;input id grade:$grade20.score;format score fscore.;cards;1 1 602 4 593 3 804 2 79;proc print;run;
用informat和format自定义格式
pft为指定样式名,low-high表示所有值,(所有值都加一个前缀)0和非0数字有区别:用0表示的话会自动去数字前面的0.最好每个程序结束都要加一个run来结束。
proc format;picture pft low-high=\
picture 不是定义值,而是定义一种显示的样式。
自定义输入和输出格式
注意:data与date 中英文大小写sqrt是平方根计算的意思。日期常量都要写成“年月日”d这种格式。
data a1;input wt ht;bmi=wt/(ht/100)**2;rbmi=sqrt(bmi);obesity=(bmi>=28);city=\"北京\";date=\"02apr2013\"d;format date yymmdd10.;cards;60 17055 16673 161;proc print;run;
利用表达式或函数直接产生新变量
lx1是用的比较运算符lx2是用的if语句产生的变量
data lx;input id lx$;lx1=lx in (\"有效\
-基本格式-if 表达式 then 新变量= ;eles 新变量= ;
利用if-then语句产生新变量
-错误示例-data fh;count=0;count=count+1;input time ;cards;232949;proc print;run;
-retain语句-data fh;retain count 0;count=count+1;input time ;cards;232949;proc print;run;
-累加语句-data fh;count+1;input time ;cards;232949;proc print;run;
data fsh;input amount;retain year 2000;year+1;total+amount;cards;100200300;proc print;run;
利用retain语句和累加语句产生新变量
注意:1.忘记写output;语句,这导致SAS只能读取最后一个数, 因为前面的数你没有通知SAS显示;2.忘记写end;语句,此时SAS找不到循环结束的标志,给不出结果。
data fh;do count=1 to 5;input time;output;end;cards;2329496487;proc print;run;
data fh;input count time;cards;1 232 293 494 645 87;proc print;run;
利用do循环语句产生新变量
SAS有个规则:字符变量的长度是由第一个遇到的值的长度决定的,而且字符变量一旦产生,它的长度就无法改变。
-错误示例-data lx;input id lx$;if lx=\"无效\" then lx2=\"无效\";else lx2=\"有效+显效+痊愈\";cards;1 显效2 有效3 无效4 痊愈;proc print;run;
length语句一定要写在if语句之前,否则就是不起作用的。
data lx;input id lx$;length lx2 $16.;if lx=\"无效\" then lx2=\"无效\";else lx2=\"有效+显效+痊愈\";cards;1 显效2 有效3 无效4 痊愈;proc print;run;
data eva;length bouns$5. eva$8.;input id g bouns$;if g<70 then eva=\"合格\";else eva=\"不合格\";cards;1 67 1000002 80 1100003 89 110000;proc print;run;
-SAS主要用length语句来指定新变量的长度与类型-length 变量 <$> 长度1 变量2 <$> 长度2 ...;
指定新变量的类型和长度
产生新变量
-错误示例-data fsh;input id age;cards;1 23 2 29 3 49 4 36;proc print;run;
@@是强制SAS往右读取数据
data fsh;input id age@@;cards;1 23 2 29 3 49 4 36;proc print;run;
@@
data score;input gender$ id score;cards;M 1 86M 2 90M 3 83M 4 79F 1 85F 2 93F 3 90;proc print;run;
data score;input gender$ n@;do id=1 to n;input score@@.;output;end;cards;M 4 86 90 83 79F 3 85 93 90;proc print;run;
@
@符号在输入方式中的应用
data age;input id birth:yymmdd10. death:yymmdd10.;age=(death-birth)/365;if age<60 then age1=50;else if age<70 then age1=60;else age1=70;format birth death yymmdd10.;cards;1 1954-12-06 2014-02-032 1938-02-18 2014-01-073 1947-07-10 2014-01-114 1943-08-21 2014-03-03;proc print;run;
与数值计算有关的函数
tranwrd有个缺点,一次只能替换一个字符串,也就是说,他不能同时把显效和痊愈都替换为有效,只能一次替换一个。所以第一个lx1将显效替换成了有效,但痊愈并没有被替换掉,所以在此基础上对lx1中的痊愈再次替换,仍然复制为lx1.
-替换变量中的字符-tranwrd(变量,查找值,替换值):从变量中找到“查找值”,并用“替换值”替换掉
compress中变量的第1个逗号后是“欲去除字符”和“修饰符”都是可选项,SAS认为compress中变量的第1个逗号后市“欲去除字符”,第2个逗号后是“修饰符”。即使你不指定“欲去除字符”,也需要用逗号留出它的位置,此时默认是去除空格。
-变量的合并-cats(变量1,变量2,...):将几个变量合并为一个变量,删除前后空格catx(\"分隔符\",变量1,变量2,...):将几个变量合并为一个变量,中间用分隔符隔开分隔符“/”“-““~”\"||\"
data baseline;input id gender$ age;mgender=missing(gender); /*判断gender是否有缺失*/mage=missing(age); /*判断age是否有缺失*/cards;1 f 602 m 593 f .4 . 48;proc print;run;
-查找变量中的缺失值-missing(变量):判断变量是否为缺失值,是则返回1,不是则返回0.SAS是用\".\"表示缺失值,所以就用if语句查找\".\"。missing对数值型变量和字符型变量都是通用的。
与字符有关的函数
-日期的合并与差值-mdy(月,日,年):将年月日合并为一个日期格式的变量或值yrdif(开始日期,结束日期,\"计算依据\"):计算两个日期之间以年为单位的差值datdif(开始日期,结束日期,\"计算依据\"):计算两个日期之间以天为单位的差值指定计算差值的依据,通常指定\"actual\
data dt;input dt:ymddttm30.; /*指定dt为ymddttmw.格式*/date=datepart(dt); /*提取dt的日期部分*/time=timepart(dt); /*提取dt的时间部分*/month=month(date); /*提取date的月*/hour=hour(time); /*提取time的小时*/formate dt datetime30.; /*指定dt的输出格式为datetime30.*/format date yymmdd10.; /*指定date的输出格式为yymmdd10.*/format time time12.; /*指定time的输出格式为time12.*/cards;2009/6/26:11:20:002009/5/5:19:30:002009/9/12:13:20:00;proc print;run;
带时间的日期变量输入格式:一是datetimew.格式(w.指定长度),主要用于ddmmyyhh:mm:ss格式的数据,如26JUN09:12:00:00;二是ymddttmw.格式(w.指定长度),主要用于<yy>yy-mm-dd/hh:mm:ss格式的数据(日期和时间之间的分隔符除了“/”外,还可以是“-”“.”\":\
-日期的提取-
与日期和时间有关的函数
子主题
data date;input year1$ month1$ day1$ year2$ month2$ day2$;date1=catx(\"/\
input函数:主要用于把字符型转为数值型格式:input(变量,输入格式):字符型转换为数值型,或将字符型转换为其他格式的字符型
put函数:主要用于把数值型转为字符型格式:put(变量,输出格式):数值型转换为字符型,或将字符型转换为其他格式的字符型
与变量类型转换有关的函数
与概率和分布有关的函数
dif和lag函数
SAS函数应用技巧
2.SAS数据集建立的高级议题
小白学SAS
收藏
0 条评论
回复 删除
下一页