小白学SAS
2024-11-07 10:09:40 2 举报
AI智能生成
小白学SAS
作者其他创作
大纲/内容
1.初识SAS
起名:英文、数字和下划线
data 数据集名
input 变量1 变量2 ...;
cards;
数据
;
数据
;
data first;
input gender age;
cards;
1 30
0 24
;
input gender age;
cards;
1 30
0 24
;
-first为永久数据集在sasuser里-
data sasuser.first;
input gender age;
cards;
1 30
0 24
;
data sasuser.first;
input gender age;
cards;
1 30
0 24
;
-在SAS逻辑库里建立一个名为“fgs”的文件夹,
并将它与电脑上的“g:\excel”文件夹关联起来-
libname fgs "g:\excel";
并将它与电脑上的“g:\excel”文件夹关联起来-
libname fgs "g:\excel";
-把first数据集添加到fgs文件夹中-
data fgs.first;
input gender sge;
cards;
1 30
0 24
;
data fgs.first;
input gender sge;
cards;
1 30
0 24
;
-在G盘EXCEL文件夹中生成一个名为FIRST的SAS数据集-
data "g:\excel\first";
input gender age;
cards;
1 30
0 24
;
data "g:\excel\first";
input gender age;
cards;
1 30
0 24
;
-对于自己建立的逻辑库,
在调用前需要用libname语句把逻辑库与文件夹建立关联-
libname fgs "g:\excel";
proc print data=fgs.first;
run;
在调用前需要用libname语句把逻辑库与文件夹建立关联-
libname fgs "g:\excel";
proc print data=fgs.first;
run;
-如果用data"g:\excel\first";语句建立永久数据集的调用程序-
proc print data="g:\excel\first";
run;
proc print data="g:\excel\first";
run;
注释格式为:/*注释*/
2.SAS数据集建立的高级议题
SAS变量的输入格式
SAS变量:字符型和数值型
input 变量1 输入格式1 变量2 输入格式2 ...;
数值型的输入格式:w.d
(w表示数值的总位数或宽度,包括小数点;
d表示数值的小数部分的位数,即使没有小数,点号也要加上)
input 变量1 输入格式1 变量2 输入格式2 ...;
数值型的输入格式:w.d
(w表示数值的总位数或宽度,包括小数点;
d表示数值的小数部分的位数,即使没有小数,点号也要加上)
data fh;
input x 4.2; /*变量后4.2表示变量x的宽度共4位,其中小数有2位*/
cards;
12
2.1
15.6
23.46
;
proc print; /*这句话的作用是让读入的数据显示在输出窗口*/
run;
input x 4.2; /*变量后4.2表示变量x的宽度共4位,其中小数有2位*/
cards;
12
2.1
15.6
23.46
;
proc print; /*这句话的作用是让读入的数据显示在输出窗口*/
run;
字符型的输入格式:$w.
(其中$符号是必须加的,w表示字节数,
1各种问占2个字节,SAS默认对字符只读取8位)
(其中$符号是必须加的,w表示字节数,
1各种问占2个字节,SAS默认对字符只读取8位)
data fh;
input pro $12.;
cards;
山东省青岛市
;
proc print;
run;
input pro $12.;
cards;
山东省青岛市
;
proc print;
run;
如果不加12.,只加一个$符合,那么只显示“山东省青”
只要加上宽度值,后面必须跟着“.”,但是如果只写$符号而没有宽度值,就不用加“.”
只要加上宽度值,后面必须跟着“.”,但是如果只写$符号而没有宽度值,就不用加“.”
日期型变量的输入格式
如果年月日之间没有任何分隔符,此时SAS要求输入的月和日都是2位
两个特殊输入字符:和&
冒号:的作用是告诉SAS,如果要读取下一个变量,需要满足下面任一条件:要么遇到空格,要么变量的宽度读完。
(一旦对变量指定了宽度,SAS就不再以默认的空格作为区分的标志了,而是按指定的宽度来识别变量。)
(一旦对变量指定了宽度,SAS就不再以默认的空格作为区分的标志了,而是按指定的宽度来识别变量。)
data fh;
input city:$18. zone$; /*在city后加了一个冒号*/
cards;
山东省蓬莱市 0536
山东省青岛市市南区 0532
;
proc print;
run;
input city:$18. zone$; /*在city后加了一个冒号*/
cards;
山东省蓬莱市 0536
山东省青岛市市南区 0532
;
proc print;
run;
data fh;
input day1: yymmdd10. day2: yymmdd10.; /*在day1后加了一个冒号*/
cards;
130125 20130528
;
proc print;
run;
input day1: yymmdd10. day2: yymmdd10.; /*在day1后加了一个冒号*/
cards;
130125 20130528
;
proc print;
run;
1.一旦对变量指定了宽度,SAS就按指定的宽度来读取变量。
2.如果指定了宽度,SAS就忽略空格的作用,而是把包括空格在内的所有字符都作为变量的值。
3.不过要记住,日期型变量的宽度最大不能超过32。
4.如果有超过2个以上的变量指定了宽度,最好都用冒号结合一个的宽度值得方式来输入。
2.如果指定了宽度,SAS就忽略空格的作用,而是把包括空格在内的所有字符都作为变量的值。
3.不过要记住,日期型变量的宽度最大不能超过32。
4.如果有超过2个以上的变量指定了宽度,最好都用冒号结合一个的宽度值得方式来输入。
&符号的作用:变量值包含空格的情况下使用
(当变量本身就有空格是时,变量之间就需要2个或2个以上的空格隔开,
这样SAS就会把这2个或2个以上的空格作为变量分隔符)
(当变量本身就有空格是时,变量之间就需要2个或2个以上的空格隔开,
这样SAS就会把这2个或2个以上的空格作为变量分隔符)
data fh;
input name&:$50. city&:$50.;
cards;
Peter Parker 山东省 蓬莱市
Ross Geller 山东省 青岛市 市南区
;
proc print;
run;
input name&:$50. city&:$50.;
cards;
Peter Parker 山东省 蓬莱市
Ross Geller 山东省 青岛市 市南区
;
proc print;
run;
SAS变量的输出格式
指定输入格式会改变变量的值,而指定输出格式不会改变变量的值,只会改变它们的样子。
input
format 变量1 格式1 变量2 格式2 ...;
cards
数值型变量常用的输出格式:3种
w.d
commaw.d(将数值的整数部分自右向左每三位用逗号隔开)
percentw.d(将数值显示位百分比的形式,%占3个字节)
input
format 变量1 格式1 变量2 格式2 ...;
cards
数值型变量常用的输出格式:3种
w.d
commaw.d(将数值的整数部分自右向左每三位用逗号隔开)
percentw.d(将数值显示位百分比的形式,%占3个字节)
data wt;
input num cost prop;
format num 5.2 cost comma12.1 prop percent8.2;
cards;
50 10205600 0.1236
45 9580000 0.0361
;
proc print;
run;
input num cost prop;
format num 5.2 cost comma12.1 prop percent8.2;
cards;
50 10205600 0.1236
45 9580000 0.0361
;
proc print;
run;
字符型的输出格式:与输入格式一样也是$w.
data fs;
input x$ y$2.;
format x$2.;
x1=x+1;
y1=y+1;
cards;
1100 1100
;
proc print;
run;
input x$ y$2.;
format x$2.;
x1=x+1;
y1=y+1;
cards;
1100 1100
;
proc print;
run;
日期型变量的输出格式
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;
input date1:yymmdd10. date2:yymmdd10. date3:yymmdd10.;
format date1 yymmdd10. date2 yymmdds8. date3 yymmddp8.;
cards;
13.06.16 130616 20130616
;
proc print;
run;
自定义输入和输出格式
用informat和format自定义格式
proc format;
invalue <$>格式名 变量值或范围1=输入格式1...; /*如果定义的输入格式是字符,需要在格式名前加$*/
value <$>格式名 变量值或范围1=输出格式1...;/*如果变量值或范围是字符,需要在格式名前加上$*/
picture 模板名<数值范围>;
invalue <$>格式名 变量值或范围1=输入格式1...; /*如果定义的输入格式是字符,需要在格式名前加$*/
value <$>格式名 变量值或范围1=输出格式1...;/*如果变量值或范围是字符,需要在格式名前加上$*/
picture 模板名<数值范围>;
proc format;
invalue fage low-<40=30 40-<50=40 50-<60=50 60-hiigh=60;
data age;
input id age fage.; /*在变量age后假上自定义的输入格式fage,别忘了加点号*/
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print;
run;
invalue fage low-<40=30 40-<50=40 50-<60=50 60-hiigh=60;
data age;
input id age fage.; /*在变量age后假上自定义的输入格式fage,别忘了加点号*/
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print;
run;
proc format;
invalue fage low-<40=30 40-<50=40 50-<60=50 60-hige=60;
data age;
input id age fage.; /*在变量age后加上自定义的输入格式fage,别忘了加点号*/
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print;
run;
invalue fage low-<40=30 40-<50=40 50-<60=50 60-hige=60;
data age;
input id age fage.; /*在变量age后加上自定义的输入格式fage,别忘了加点号*/
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print;
run;
proc formate要写在data语句前
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 60
2 4 59
3 3 80
4 2 79
;
proc print;
run;
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 60
2 4 59
3 3 80
4 2 79
;
proc print;
run;
grade 本身值1~4都只有1位宽度,但是指定的输入格式,
真正读取的是Freshman、Sophomore等,所以需要grade:$grade20.
value需要用format语句将变量score和输出格式fscore关联起来。
proc format是个过程,format是个语句,
只是把变量与某种输出格式关联起来,让变量按照这种格式输出。
真正读取的是Freshman、Sophomore等,所以需要grade:$grade20.
value需要用format语句将变量score和输出格式fscore关联起来。
proc format是个过程,format是个语句,
只是把变量与某种输出格式关联起来,让变量按照这种格式输出。
picture 不是定义值,而是定义一种显示的样式。
proc format;
picture pft low-high="0,000,000"(prefix="¥");
picture pro low-high="09.99%";
run;
data profit;
input profit prop;
format profit pft. prop pro.;
cards;
298630 16.72
365800 21.30
;
proc print;
run;
picture pft low-high="0,000,000"(prefix="¥");
picture pro low-high="09.99%";
run;
data profit;
input profit prop;
format profit pft. prop pro.;
cards;
298630 16.72
365800 21.30
;
proc print;
run;
pft为指定样式名,low-high表示所有值,(所有值都加一个前缀)
0和非0数字有区别:用0表示的话会自动去数字前面的0.
最好每个程序结束都要加一个run来结束。
0和非0数字有区别:用0表示的话会自动去数字前面的0.
最好每个程序结束都要加一个run来结束。
产生新变量
利用表达式或函数直接产生新变量
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 170
55 166
73 161
;
proc print;
run;
input wt ht;
bmi=wt/(ht/100)**2;
rbmi=sqrt(bmi);
obesity=(bmi>=28);
city="北京";
date="02apr2013"d;
format date yymmdd10.;
cards;
60 170
55 166
73 161
;
proc print;
run;
注意:data与date 中英文大小写
sqrt是平方根计算的意思。
日期常量都要写成“年月日”d这种格式。
sqrt是平方根计算的意思。
日期常量都要写成“年月日”d这种格式。
利用if-then语句产生新变量
-基本格式-
if 表达式 then 新变量= ;
eles 新变量= ;
if 表达式 then 新变量= ;
eles 新变量= ;
data lx;
input id lx$;
lx1=lx in ("有效","显效","痊愈");
if lx in ("有效","显效","痊愈")then lx2="有效";else lx2="无效";
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
input id lx$;
lx1=lx in ("有效","显效","痊愈");
if lx in ("有效","显效","痊愈")then lx2="有效";else lx2="无效";
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
lx1是用的比较运算符
lx2是用的if语句产生的变量
lx2是用的if语句产生的变量
利用retain语句和累加语句产生新变量
-retain语句基本格式-
retain 变量 <初始值>;
例如:retain a 21;(指定a的初始值为21)
retain year 2001 total 0;(指定year的初始值为2001,total的初始值为0)
-累加语句基本格式-
变量+表达式
year+1,(默认year=0,year+1产生的结果就是year=1)
total+amount;(amount变量必须在前面已经指定了,此时相当于total=total+amount)
retain 变量 <初始值>;
例如:retain a 21;(指定a的初始值为21)
retain year 2001 total 0;(指定year的初始值为2001,total的初始值为0)
-累加语句基本格式-
变量+表达式
year+1,(默认year=0,year+1产生的结果就是year=1)
total+amount;(amount变量必须在前面已经指定了,此时相当于total=total+amount)
-错误示例-
data fh;
count=0;
count=count+1;
input time ;
cards;
23
29
49
;
proc print;
run;
data fh;
count=0;
count=count+1;
input time ;
cards;
23
29
49
;
proc print;
run;
-retain语句-
data fh;
retain count 0;
count=count+1;
input time ;
cards;
23
29
49
;
proc print;
run;
data fh;
retain count 0;
count=count+1;
input time ;
cards;
23
29
49
;
proc print;
run;
-累加语句-
data fh;
count+1;
input time ;
cards;
23
29
49
;
proc print;
run;
data fh;
count+1;
input time ;
cards;
23
29
49
;
proc print;
run;
data fsh;
input amount;
retain year 2000;
year+1;
total+amount;
cards;
100
200
300
;proc print;
run;
input amount;
retain year 2000;
year+1;
total+amount;
cards;
100
200
300
;proc print;
run;
利用do循环语句产生新变量
data fh;
input count time;
cards;
1 23
2 29
3 49
4 64
5 87
;
proc print;
run;
input count time;
cards;
1 23
2 29
3 49
4 64
5 87
;
proc print;
run;
data fh;
do count=1 to 5;
input time;
output;
end;
cards;
23
29
49
64
87
;
proc print;
run;
do count=1 to 5;
input time;
output;
end;
cards;
23
29
49
64
87
;
proc print;
run;
注意:
1.忘记写output;语句,这导致SAS只能读取最后一个数,
因为前面的数你没有通知SAS显示;
2.忘记写end;语句,此时SAS找不到循环结束的标志,给不出结果。
1.忘记写output;语句,这导致SAS只能读取最后一个数,
因为前面的数你没有通知SAS显示;
2.忘记写end;语句,此时SAS找不到循环结束的标志,给不出结果。
指定新变量的类型和长度
-SAS主要用length语句来指定新变量的长度与类型-
length 变量 <$> 长度1 变量2 <$> 长度2 ...;
length 变量 <$> 长度1 变量2 <$> 长度2 ...;
-错误示例-
data lx;
input id lx$;
if lx="无效" then lx2="无效";
else lx2="有效+显效+痊愈";
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
data lx;
input id lx$;
if lx="无效" then lx2="无效";
else lx2="有效+显效+痊愈";
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
SAS有个规则:字符变量的长度是由第一个遇到的值的长度决定的,
而且字符变量一旦产生,它的长度就无法改变。
而且字符变量一旦产生,它的长度就无法改变。
data lx;
input id lx$;
length lx2 $16.;
if lx="无效" then lx2="无效";
else lx2="有效+显效+痊愈";
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
input id lx$;
length lx2 $16.;
if lx="无效" then lx2="无效";
else lx2="有效+显效+痊愈";
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
length语句一定要写在if语句之前,否则就是不起作用的。
data eva;
length bouns$5. eva$8.;
input id g bouns$;
if g<70 then eva="合格";else eva="不合格";
cards;
1 67 100000
2 80 110000
3 89 110000
;
proc print;
run;
length bouns$5. eva$8.;
input id g bouns$;
if g<70 then eva="合格";else eva="不合格";
cards;
1 67 100000
2 80 110000
3 89 110000
;
proc print;
run;
@符号在输入方式中的应用
@@
-错误示例-
data fsh;
input id age;
cards;
1 23 2 29 3 49 4 36
;
proc print;
run;
data fsh;
input id age;
cards;
1 23 2 29 3 49 4 36
;
proc print;
run;
data fsh;
input id age@@;
cards;
1 23 2 29 3 49 4 36
;
proc print;
run;
input id age@@;
cards;
1 23 2 29 3 49 4 36
;
proc print;
run;
@@是强制SAS往右读取数据
@
data score;
input gender$ id score;
cards;
M 1 86
M 2 90
M 3 83
M 4 79
F 1 85
F 2 93
F 3 90
;
proc print;
run;
input gender$ id score;
cards;
M 1 86
M 2 90
M 3 83
M 4 79
F 1 85
F 2 93
F 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 79
F 3 85 93 90
;
proc print;
run;
input gender$ n@;
do id=1 to n;
input score@@.;
output;
end;
cards;
M 4 86 90 83 79
F 3 85 93 90
;
proc print;
run;
SAS函数应用技巧
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-03
2 1938-02-18 2014-01-07
3 1947-07-10 2014-01-11
4 1943-08-21 2014-03-03
;
proc print;
run;
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-03
2 1938-02-18 2014-01-07
3 1947-07-10 2014-01-11
4 1943-08-21 2014-03-03
;
proc print;
run;
与数值计算有关的函数
round(4.8,2),意思是将4.8舍入到最接近能被2整除的数值(如0、2、4、6等)
data aa;
input age@@;
gage=round(age-5,10);
cards;
29 31 39 40 55 60 64
;
proc print;
run;
input age@@;
gage=round(age-5,10);
cards;
29 31 39 40 55 60 64
;
proc print;
run;
data aa;
input id@@;
if mod(id,2)=1 then group="A";else group="B";
cards;
1 2 3 4 5 6 7 8 9 10
;
proc print;
run;
input id@@;
if mod(id,2)=1 then group="A";else group="B";
cards;
1 2 3 4 5 6 7 8 9 10
;
proc print;
run;
与字符有关的函数
-计算变量的长度-
length(变量):计算变量长度,对缺失值返回1
lengthn(变量):计算变量长度,对缺失值返回0
-提取变量中的字符-
substrn格式:substrn(变量,起始位置<,提取长度>):指定一个变量,
对该变量从起始位置开始,提取指定长度的字符,
起始位置是从第几个字符开始提取,提取长度是提取多少个字符,
这是可选项,如果不写,默认提取到最后一个字符
length(变量):计算变量长度,对缺失值返回1
lengthn(变量):计算变量长度,对缺失值返回0
-提取变量中的字符-
substrn格式:substrn(变量,起始位置<,提取长度>):指定一个变量,
对该变量从起始位置开始,提取指定长度的字符,
起始位置是从第几个字符开始提取,提取长度是提取多少个字符,
这是可选项,如果不写,默认提取到最后一个字符
data iden;
input iden:$18.;
if length(iden)=18 then gen=substrn(iden,17,1);
else gen=substrn(iden,15,1);
if mod(gen,2)=1 then gender="男";
else gender="女";
cards;
36053319720613591x
360533801215792
360533198208254533
360533851009226
;
proc print;
run;
input iden:$18.;
if length(iden)=18 then gen=substrn(iden,17,1);
else gen=substrn(iden,15,1);
if mod(gen,2)=1 then gender="男";
else gender="女";
cards;
36053319720613591x
360533801215792
360533198208254533
360533851009226
;
proc print;
run;
-查找变量中的字符-
find(变量,查找内容<,"i"><,起始位置>)
findc(变量,查找内容<,"i"><,起始位置>)
<,"i">是忽略查找字符的大小写 <,起始位置>从第几个字符开始查找,如果不写,默认从第1个字符开始。
根据指定的起始位置,查找相应的内容。如果找到,就返回找到的位置;如果找不到,就返回到0
对于多个字符的查找,find必须是所有字符都完全匹配才算找到,而findc只要找到字符中的任意一个就算找到。
find(变量,查找内容<,"i"><,起始位置>)
findc(变量,查找内容<,"i"><,起始位置>)
<,"i">是忽略查找字符的大小写 <,起始位置>从第几个字符开始查找,如果不写,默认从第1个字符开始。
根据指定的起始位置,查找相应的内容。如果找到,就返回找到的位置;如果找不到,就返回到0
对于多个字符的查找,find必须是所有字符都完全匹配才算找到,而findc只要找到字符中的任意一个就算找到。
data book;
input book:&$100.;
sas=find(book,"sas","i");
if sas>0 then class="SAS书";
else class="其他";
cards;
Survival Analysis Using SAS
Matlab程序设计
SPSS数据分析
SAS应用分析
The Little SAS Book
;
proc print;
run;
input book:&$100.;
sas=find(book,"sas","i");
if sas>0 then class="SAS书";
else class="其他";
cards;
Survival Analysis Using SAS
Matlab程序设计
SPSS数据分析
SAS应用分析
The Little SAS Book
;
proc print;
run;
anyalpha(变量<,起始位置>);查找变量中任意的字母,并返回第一个字母的位置
anydigit(变量<,起始位置>);查找变量中任意的数字,并返回第一个数字的位置
anyalnum(变量<,起始位置>);查找变量中任意的字母或数字,并返回第一个字母或数字的位置
anydigit(变量<,起始位置>);查找变量中任意的数字,并返回第一个数字的位置
anyalnum(变量<,起始位置>);查找变量中任意的字母或数字,并返回第一个字母或数字的位置
data computer;
input type$@@;
alpha=anyalpha(type); /*返回第1次出现字母的位置*/
digit=anydigit(type); /*返回第1次出现数字的位置*/
xh=substrn(type,alpha,digit-alpha); /*提取type中的字母*/
bh=substrn(type,digit,length(type)-digit+1); /*提取type中的数字*/
cards;
TP340 KS320 B3510 C560 H430
;
proc print;
run;
input type$@@;
alpha=anyalpha(type); /*返回第1次出现字母的位置*/
digit=anydigit(type); /*返回第1次出现数字的位置*/
xh=substrn(type,alpha,digit-alpha); /*提取type中的字母*/
bh=substrn(type,digit,length(type)-digit+1); /*提取type中的数字*/
cards;
TP340 KS320 B3510 C560 H430
;
proc print;
run;
-替换变量中的字符-
tranwrd(变量,查找值,替换值):从变量中找到“查找值”,并用“替换值”替换掉
tranwrd(变量,查找值,替换值):从变量中找到“查找值”,并用“替换值”替换掉
data lx;
input id lx$;
lx1=tranwrd(lx,"显效","有效");/*将lx变量中的“显效”替换为“有效”*/
lx1=tranwrd(lx1,"痊愈","有效");/*将lx1变量中的“痊愈”替换为“有效”*/
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
input id lx$;
lx1=tranwrd(lx,"显效","有效");/*将lx变量中的“显效”替换为“有效”*/
lx1=tranwrd(lx1,"痊愈","有效");/*将lx1变量中的“痊愈”替换为“有效”*/
cards;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
tranwrd有个缺点,一次只能替换一个字符串,
也就是说,他不能同时把显效和痊愈都替换为有效,只能一次替换一个。
所以第一个lx1将显效替换成了有效,但痊愈并没有被替换掉,
所以在此基础上对lx1中的痊愈再次替换,仍然复制为lx1.
也就是说,他不能同时把显效和痊愈都替换为有效,只能一次替换一个。
所以第一个lx1将显效替换成了有效,但痊愈并没有被替换掉,
所以在此基础上对lx1中的痊愈再次替换,仍然复制为lx1.
-去除变量中的字符-
compress(变量<,欲去除的字符><,"修饰符">):从变量中去掉"欲去除的字符"
指定不同的修饰符,常用的有:
a,去掉变量中的所有字母
d,去掉变量中的所有数字
s,去掉变量中的所有空格
i,忽略大小写
k,保留“欲去除的字符”,去掉其他字符
compress(变量<,欲去除的字符><,"修饰符">):从变量中去掉"欲去除的字符"
指定不同的修饰符,常用的有:
a,去掉变量中的所有字母
d,去掉变量中的所有数字
s,去掉变量中的所有空格
i,忽略大小写
k,保留“欲去除的字符”,去掉其他字符
data computer;
input type$@@;
xh=compress(type,,"d"); /*去除type中的所有数字*/
bh=compress(type,,"a"); /*去除type中的所有字母*/
cards;
TP340 KS320 B3510 C560 H430
;
proc print;
run;
input type$@@;
xh=compress(type,,"d"); /*去除type中的所有数字*/
bh=compress(type,,"a"); /*去除type中的所有字母*/
cards;
TP340 KS320 B3510 C560 H430
;
proc print;
run;
compress中变量的第1个逗号后是“欲去除字符”和“修饰符”都是可选项,
SAS认为compress中变量的第1个逗号后市“欲去除字符”,第2个逗号后是“修饰符”。
即使你不指定“欲去除字符”,也需要用逗号留出它的位置,此时默认是去除空格。
SAS认为compress中变量的第1个逗号后市“欲去除字符”,第2个逗号后是“修饰符”。
即使你不指定“欲去除字符”,也需要用逗号留出它的位置,此时默认是去除空格。
data phone;
input phone:&$20.;
phone1=compress(phone,"(-) "); /*去除phone中的4个字符“(-) ”*/
phone2=compress(phone,,"kd"); /*保留phone中的所有数字*/
cards;
(010)67658925
010-67685621
010 67685621
;
proc print;
run;
input phone:&$20.;
phone1=compress(phone,"(-) "); /*去除phone中的4个字符“(-) ”*/
phone2=compress(phone,,"kd"); /*保留phone中的所有数字*/
cards;
(010)67658925
010-67685621
010 67685621
;
proc print;
run;
-变量的合并-
cats(变量1,变量2,...):将几个变量合并为一个变量,删除前后空格
catx("分隔符",变量1,变量2,...):将几个变量合并为一个变量,中间用分隔符隔开
分隔符“/”“-““~”"||"
cats(变量1,变量2,...):将几个变量合并为一个变量,删除前后空格
catx("分隔符",变量1,变量2,...):将几个变量合并为一个变量,中间用分隔符隔开
分隔符“/”“-““~”"||"
data code;
input prov$ city$ county$;
code1=cats(prov,city,county);
code2=catx("-",prov,city,county);
code3=prov||city||county;
cards;
37 05 02
37 03 21
37 06 13
37 06 85
;
proc print;
run;
input prov$ city$ county$;
code1=cats(prov,city,county);
code2=catx("-",prov,city,county);
code3=prov||city||county;
cards;
37 05 02
37 03 21
37 06 13
37 06 85
;
proc print;
run;
-清点变量中某字符的个数-
count(变量,欲清点的字符<,"i">):从变量中找到"欲清点的字符",返回字符个数,
如果没有找到,返回0.<,"i">指定修饰符i,作用是忽略大小写。
count(变量,欲清点的字符<,"i">):从变量中找到"欲清点的字符",返回字符个数,
如果没有找到,返回0.<,"i">指定修饰符i,作用是忽略大小写。
data cloth;
input pj&:$1000.;
beauty=count(pj,"漂亮");
cards;
裙子很漂亮,穿起来有仙女的感觉
裙子很喜欢,很漂亮,不知道面料牢固不牢固
裙子很漂亮
裙子很飘逸
面料柔软舒适,很飘逸
很漂亮,超喜欢这颜色
质量一般,没想象中的好
很大方,不足之处是,透气性不是非常好
;
proc print;
run;
input pj&:$1000.;
beauty=count(pj,"漂亮");
cards;
裙子很漂亮,穿起来有仙女的感觉
裙子很喜欢,很漂亮,不知道面料牢固不牢固
裙子很漂亮
裙子很飘逸
面料柔软舒适,很飘逸
很漂亮,超喜欢这颜色
质量一般,没想象中的好
很大方,不足之处是,透气性不是非常好
;
proc print;
run;
data ques;
input id (y1-y10)($); /*输入变量y1-y10,均为字符型,统一加上$符号*/
y=cats(of y1-y10); /*将y1-y10合并为一个变量y*/
cy=count(y,"y","i"); /*统计变量y中的"y"的个数,忽略大小写*/
cn=count(y,"n","i"); /*统计变量y中的"n"的个数,忽略大小写*/
cards;
1 y y n Y n y n Y n n
2 y n y Y n y y Y n y
3 n y N y y y n Y y n
4 n n Y y y y N Y n y
;
proc print;
run;
input id (y1-y10)($); /*输入变量y1-y10,均为字符型,统一加上$符号*/
y=cats(of y1-y10); /*将y1-y10合并为一个变量y*/
cy=count(y,"y","i"); /*统计变量y中的"y"的个数,忽略大小写*/
cn=count(y,"n","i"); /*统计变量y中的"n"的个数,忽略大小写*/
cards;
1 y y n Y n y n Y n n
2 y n y Y n y y Y n y
3 n y N y y y n Y y n
4 n n Y y y y N Y n y
;
proc print;
run;
-查找变量中的缺失值-
missing(变量):判断变量是否为缺失值,是则返回1,不是则返回0.
SAS是用"."表示缺失值,所以就用if语句查找"."。
missing对数值型变量和字符型变量都是通用的。
missing(变量):判断变量是否为缺失值,是则返回1,不是则返回0.
SAS是用"."表示缺失值,所以就用if语句查找"."。
missing对数值型变量和字符型变量都是通用的。
data baseline;
input id gender$ age;
mgender=missing(gender); /*判断gender是否有缺失*/
mage=missing(age); /*判断age是否有缺失*/
cards;
1 f 60
2 m 59
3 f .
4 . 48
;
proc print;
run;
input id gender$ age;
mgender=missing(gender); /*判断gender是否有缺失*/
mage=missing(age); /*判断age是否有缺失*/
cards;
1 f 60
2 m 59
3 f .
4 . 48
;
proc print;
run;
与日期和时间有关的函数
-日期的合并与差值-
mdy(月,日,年):将年月日合并为一个日期格式的变量或值
yrdif(开始日期,结束日期,"计算依据"):计算两个日期之间以年为单位的差值
datdif(开始日期,结束日期,"计算依据"):计算两个日期之间以天为单位的差值
指定计算差值的依据,通常指定"actual",也就是按当年的实际天数计算,也可以指定其他依据,比如“ACT/365”,
表示不管当年多少天,全部都按365天来算。
mdy(月,日,年):将年月日合并为一个日期格式的变量或值
yrdif(开始日期,结束日期,"计算依据"):计算两个日期之间以年为单位的差值
datdif(开始日期,结束日期,"计算依据"):计算两个日期之间以天为单位的差值
指定计算差值的依据,通常指定"actual",也就是按当年的实际天数计算,也可以指定其他依据,比如“ACT/365”,
表示不管当年多少天,全部都按365天来算。
data date;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1=mdy(month1,day1,year1);
date2=mdy(month2,day2,year2);
format date1 date2 yymmdd10.;
ydif=yrdif(date1,date2,"actual");
ddif=datdif(date1,date2,"actual");
cards;
2013 05 21 2014 03 11
2013 03 10 2014 01 22
2013 06 05 2014 05 06
2013 07 08 2014 04 13
;
proc print;
run;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1=mdy(month1,day1,year1);
date2=mdy(month2,day2,year2);
format date1 date2 yymmdd10.;
ydif=yrdif(date1,date2,"actual");
ddif=datdif(date1,date2,"actual");
cards;
2013 05 21 2014 03 11
2013 03 10 2014 01 22
2013 06 05 2014 05 06
2013 07 08 2014 04 13
;
proc print;
run;
-日期的提取-
带时间的日期变量输入格式:
一是datetimew.格式(w.指定长度),主要用于ddmmyyhh:mm:ss格式的数据,如26JUN09:12:00:00;
二是ymddttmw.格式(w.指定长度),主要用于<yy>yy-mm-dd/hh:mm:ss格式的数据
(日期和时间之间的分隔符除了“/”外,还可以是“-”“.”":" ),如2009/6/26:13:00:00
带时间的日期变量输出格式:
datetimew.(w.指定长度),显示为ddmmyy hh:mm:ss的格式,如26JUN09:13:00:00
如果只有时间而没有日期,输入和输出格式可以写成timew.(w.指定长度)的格式。
一是datetimew.格式(w.指定长度),主要用于ddmmyyhh:mm:ss格式的数据,如26JUN09:12:00:00;
二是ymddttmw.格式(w.指定长度),主要用于<yy>yy-mm-dd/hh:mm:ss格式的数据
(日期和时间之间的分隔符除了“/”外,还可以是“-”“.”":" ),如2009/6/26:13:00:00
带时间的日期变量输出格式:
datetimew.(w.指定长度),显示为ddmmyy hh:mm:ss的格式,如26JUN09:13:00:00
如果只有时间而没有日期,输入和输出格式可以写成timew.(w.指定长度)的格式。
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:00
2009/5/5:19:30:00
2009/9/12:13:20:00
;
proc print;
run;
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:00
2009/5/5:19:30:00
2009/9/12:13:20:00
;
proc print;
run;
与变量类型转换有关的函数
*当使用自定义格式时,如果用input函数,proc format就要用invalue语句;
*如果用put函数,proc format就要用value语句。put函数输出的值一定是字符型。
*靠左是字符型,靠右是数字型
*当使用自定义格式时,如果用input函数,proc format就要用invalue语句;
*如果用put函数,proc format就要用value语句。put函数输出的值一定是字符型。
*靠左是字符型,靠右是数字型
input函数:主要用于把字符型转为数值型
格式:input(变量,输入格式):字符型转换为数值型,或将字符型转换为其他格式的字符型
格式:input(变量,输入格式):字符型转换为数值型,或将字符型转换为其他格式的字符型
data date;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1=catx("/",year1,month1,day1);
date2=catx("/",year2,month2,day2);
d1=input(date1,yymmdd10.); /*将date1按yymmdd10.的格式转换为日期型*/
d2=input(date2,yymmdd10.); /*将date2按yymmdd10.的格式转换为日期型*/
format d1 d2 yymmdd8.;
dif=d2-d1;
cards;
2013 05 21 2014 03 11
2013 03 10 2014 01 22
2013 06 05 2014 05 06
2013 07 08 2014 04 13
;
proc print;
run;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1=catx("/",year1,month1,day1);
date2=catx("/",year2,month2,day2);
d1=input(date1,yymmdd10.); /*将date1按yymmdd10.的格式转换为日期型*/
d2=input(date2,yymmdd10.); /*将date2按yymmdd10.的格式转换为日期型*/
format d1 d2 yymmdd8.;
dif=d2-d1;
cards;
2013 05 21 2014 03 11
2013 03 10 2014 01 22
2013 06 05 2014 05 06
2013 07 08 2014 04 13
;
proc print;
run;
子主题
data date;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1=cats(year1,month1,day1);
date2=cats(year2,month2,day2);
d1=input(date1,yymmdd10.); /*将date1按yymmdd10.的格式转为日期型 */
d2=input(date2,yymmdd10.); /*将date2按yymmdd10.的格式转为日期型 */
d3=input(date1,8.); /*将date1按8.的格式转为数值型 */
d4=input(date2,8.); /*将date2按8.的格式转为数值型 */
format d1 d2 yymmdd10.;
dif1=d2-d1;
dif2=d4-d3;
cards;
2013 05 21 2014 03 11
;
proc print;
run;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1=cats(year1,month1,day1);
date2=cats(year2,month2,day2);
d1=input(date1,yymmdd10.); /*将date1按yymmdd10.的格式转为日期型 */
d2=input(date2,yymmdd10.); /*将date2按yymmdd10.的格式转为日期型 */
d3=input(date1,8.); /*将date1按8.的格式转为数值型 */
d4=input(date2,8.); /*将date2按8.的格式转为数值型 */
format d1 d2 yymmdd10.;
dif1=d2-d1;
dif2=d4-d3;
cards;
2013 05 21 2014 03 11
;
proc print;
run;
put函数:主要用于把数值型转为字符型
格式:put(变量,输出格式):数值型转换为字符型,或将字符型转换为其他格式的字符型
proc format;
value fage low-<40=30 40-<50=40 50-<60=50 60-high=60;
data age;
input id age;
ageg=put(age,fage.);
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print ;
run;
格式:put(变量,输出格式):数值型转换为字符型,或将字符型转换为其他格式的字符型
proc format;
invalue fage low-<40=30 40-<50=40 50-<60=50 60-high=60;
data age;
input id age fage.;
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print ;
run;
invalue fage low-<40=30 40-<50=40 50-<60=50 60-high=60;
data age;
input id age fage.;
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print ;
run;
proc format;
value fage low-<40=30 40-<50=40 50-<60=50 60-high=60;
data age;
input id age;
ageg=put(age,fage.);
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print ;
run;
*靠左是字符型,靠右是数字型;
*当使用自定义格式时,如果用input函数,proc format就要用invalue语句;如果用put函数,proc format就要用value语句。
*put函数输出的值一定是字符型的,不管它看起来是数字还是其他样子。
*用input和put函数转换已有变量的时候一定要赋值给另外一个变量,而不是原有变量。
*当使用自定义格式时,如果用input函数,proc format就要用invalue语句;如果用put函数,proc format就要用value语句。
*put函数输出的值一定是字符型的,不管它看起来是数字还是其他样子。
*用input和put函数转换已有变量的时候一定要赋值给另外一个变量,而不是原有变量。
与概率和分布有关的函数
cdf("分布",分位数,参数):返回指定分布的累计概率分布与分位数对应的概率
dif和lag函数
3.SAS数据清洗和加工
数据合并
利用set语句进行纵向合并
data 数据集;
set 数据集1 数据集2 ...;
run;
set 数据集1 数据集2 ...;
run;
*如果后面只有一个数据集,此时相当于复制的作用。
set 数据集1(in=临时变量1) 数据集2(in=临时变量2)...;
data ab1;
set saauser.a1 sasuser.b1;
proc print;
run;
set saauser.a1 sasuser.b1;
proc print;
run;
set 数据集1(rename=(原名1=新名1 ...)) 数据集2(rename=(原名1=新名1 ...)) ...;
data ab1;
set sasuser.a1 sasuser.b1(rename=(ht=height wt=weight));
proc print;
run;
set sasuser.a1 sasuser.b1(rename=(ht=height wt=weight));
proc print;
run;
用proc contents看变量的属性
proc contents data=sasuser.a2;
run;
run;
将字符型的time转为数值型
data saauser.b2;
set sasuser.b2;
time1=input(time,yymmdd10.);
format time1 yymmdd10.;
drop time;
rename time1=time;
run;
data saauser.b2;
set sasuser.b2;
time1=input(time,yymmdd10.);
format time1 yymmdd10.;
drop time;
rename time1=time;
run;
data语句作用是创建新的空白数据集
drop语句是删除
drop语句是删除
a2和b2合并后区分
data ab2;
set sasuser.a2(in=a) sasuser.b2(in=b);
a2=a;
b2=b;
proc print;
run;
set sasuser.a2(in=a) sasuser.b2(in=b);
a2=a;
b2=b;
proc print;
run;
in=a的意思是产生临时变量a
通过In=选项就可以吧合并数据集中的子数据集做个标识,但是临时变量可以调用,但不会在结果中显示。
只要用到数据集选项“in=临时变量”,就加一句“新变量=临时变量”
通过In=选项就可以吧合并数据集中的子数据集做个标识,但是临时变量可以调用,但不会在结果中显示。
只要用到数据集选项“in=临时变量”,就加一句“新变量=临时变量”
利用mergr语句进行横向合并
data 数据集;
merge 数据集1 数据集2 ...;
by 变量1 变量2 ...;
run;
merge 数据集1 数据集2 ...;
by 变量1 变量2 ...;
run;
data ab;
merge ab1 ab2;
by id;
drop a2 b2;
proc print;
run;
merge ab1 ab2;
by id;
drop a2 b2;
proc print;
run;
再利用by语句进行横向合并时,如果两个数据集实现一定要分别对他们都排序才能合并。
drop a2 b2;意思是删除a2 b2这两个变量。
drop a2 b2;意思是删除a2 b2这两个变量。
两个数据的交集
data ab;
merge ab1(in=d1) ab2(in=d2);
by id;
proc print;
run;
merge ab1(in=d1) ab2(in=d2);
by id;
proc print;
run;
if d1=1 and d2=1;的意思是跟在set或merge语句后面时,他所起到的作用就是根据指定的表达式保留符合条件的观测。
数据对比
proc compare <base=数据集 compare=数据集><nosummary><transpose>;
by变量1 变量2 ...;
id变量1 变量2 ...;
run;
by变量1 变量2 ...;
id变量1 变量2 ...;
run;
proc compare base=ab compare=cd nosummary;
by id;
run;
nosusmmary 的作用是不显示一些概括性的结果。
by id;
run;
nosusmmary 的作用是不显示一些概括性的结果。
proc compare base=ab compare=cd nodummary transpose;
by id;
id id;
run;
按记录来显示核对。
by id;
id id;
run;
按记录来显示核对。
data sasuser.xb;
set ab;
if id=4 then time="16Jun2012"d;
proc pront;
run;
set ab;
if id=4 then time="16Jun2012"d;
proc pront;
run;
数据清洗-查找和删除重复项
数据清洗-查找和删除重复项
proc sort <data=数据集> <out=数据集><niuniquekey><nodupkey>;
by<descending>变量1<descending>变量2 ...;
run;
*proc sort 语句调用排序过程,选项data是指定对哪个数据集进行排序,选项out是数据集排序后输出位置,否则将覆盖原数据集。
*nouniquekey是输出重复值,nodupkey是删除重复值,输出唯一值。
*by语句是指定排序的变量,可以指定多个,选项descending表示按降序排序,如果不加,默认为按升序排序。
by<descending>变量1<descending>变量2 ...;
run;
*proc sort 语句调用排序过程,选项data是指定对哪个数据集进行排序,选项out是数据集排序后输出位置,否则将覆盖原数据集。
*nouniquekey是输出重复值,nodupkey是删除重复值,输出唯一值。
*by语句是指定排序的变量,可以指定多个,选项descending表示按降序排序,如果不加,默认为按升序排序。
proc sort data=ab1;
by id;
proc sort data=ab2;
by id;
run;
data ab;
merge ab1 ab2;
by id;
proc print;
run;
by id;
proc sort data=ab2;
by id;
run;
data ab;
merge ab1 ab2;
by id;
proc print;
run;
proc sort data=sasuser.xb nouniquekey out=rep;
by nanme gender;
proc print data=rap;
run;
输出重复值
by nanme gender;
proc print data=rap;
run;
输出重复值
proc sort data=sasuser.xb nodupkey out=norep;
by name gender;
proc print data=norep;
run;
输出唯一值
by name gender;
proc print data=norep;
run;
输出唯一值
扩展内容;first.变量和last.变量
data patients;
input id gender age time yymmdd10. sbp;
format time yymmdd10.;
cards;
1 1 51 2010/01/12 150
1 1 51 2010/02/12 147
1 1 51 2010/03/14 142
2 2 59 2010/01/09 163
2 2 59 2010/02/10 162
2 2 59 2010/03/17 160
2 2 59 2010/04/16 151
;
proc sort;
by id time; /*按id和time升序排序 */
run;
data patients;
set patients;
by id;
if first.id then firstsbp=sbp; /*对每个人的第一个观测,将sbp值赋给firstsbp */
retain firstsbp; /*利用retain语句让firstsbp保留上个观测值 */
difsbp=sbp-firstsbp; /*计算每次测量值与首次测量值的差值 */
proc print;
run;
input id gender age time yymmdd10. sbp;
format time yymmdd10.;
cards;
1 1 51 2010/01/12 150
1 1 51 2010/02/12 147
1 1 51 2010/03/14 142
2 2 59 2010/01/09 163
2 2 59 2010/02/10 162
2 2 59 2010/03/17 160
2 2 59 2010/04/16 151
;
proc sort;
by id time; /*按id和time升序排序 */
run;
data patients;
set patients;
by id;
if first.id then firstsbp=sbp; /*对每个人的第一个观测,将sbp值赋给firstsbp */
retain firstsbp; /*利用retain语句让firstsbp保留上个观测值 */
difsbp=sbp-firstsbp; /*计算每次测量值与首次测量值的差值 */
proc print;
run;
一是用proc sort 过程按id和time排序,这样SAS后台产生了first.id和last.id两个自动变量;
二是用set语句复制数据集时,也要加上by语句,否则SAS依然不认first.id和last.id.
二是用set语句复制数据集时,也要加上by语句,否则SAS依然不认first.id和last.id.
当if语句跟在set后面时,其作用时保留符合条件的观测。
first.id不是指第一个id值,而是id为某个值时,它所对应的多个观测中的第一个观测;同样,last.id不是指最后一个id值,而是id为某个值时,它所对应的多个观测中的最后一个观测。
数据清洗-查找缺失值
补充内容-数组
array 数组名[下标]<$><数组元素><(元素初始值)>;
array是定义数组的标志,看到array,你就要知道后面跟着的是数组。
数组名是给数组起个名字,名字的规则与SAS数据集名一样。
下表指定数组中包括的元素个数,这里的元素一般就是变量。
数组元素主要是列出数组中包含的1个或多个变量,这些变量可以是数据集中的已有变量,也可以是新的变量。如果新建的变量是字符型,需要在前面加上¥符号。
元素初始值指定新变量的值,如果不指定元素初始值,默认新变量的值为缺失值。
array s[5] a b c d e; 表示可以用s[1],s[2],s[3] s[4] s[5]分别代表a,b,c,d,e这五个变量。当你对s[1]操作时,就相当于对a进行操作,但s[1]~s[5]的命名更有规律,因而更容易执行一些批量命令。
array是定义数组的标志,看到array,你就要知道后面跟着的是数组。
数组名是给数组起个名字,名字的规则与SAS数据集名一样。
下表指定数组中包括的元素个数,这里的元素一般就是变量。
数组元素主要是列出数组中包含的1个或多个变量,这些变量可以是数据集中的已有变量,也可以是新的变量。如果新建的变量是字符型,需要在前面加上¥符号。
元素初始值指定新变量的值,如果不指定元素初始值,默认新变量的值为缺失值。
array s[5] a b c d e; 表示可以用s[1],s[2],s[3] s[4] s[5]分别代表a,b,c,d,e这五个变量。当你对s[1]操作时,就相当于对a进行操作,但s[1]~s[5]的命名更有规律,因而更容易执行一些批量命令。
数组定义的注意事项:
数组名不能与数据集中已有的变量重名,也不要与已有函数同名。
一个数组中的变量类型必须相同,不能既有数值型,又有字符型。
数组中下标的写法既可以用【】,也可以用{}或(),根据个人习惯。
数组中下表也可以是个范围,如arrat x[11:15] y11 y12 y13 y14 y15;。
数组中“下标”可以不写,而用*代替。如array 下【*】a b c;,SAS会自动根据变量个数来判断下标值为3.
数组中的“数组元素”可以不写,如array y[3];等同于array y[3] y1 y2 y3;.
元素初始值一定要用()括起来,各个值之间可以用逗号或空格隔开。
数组名不能与数据集中已有的变量重名,也不要与已有函数同名。
一个数组中的变量类型必须相同,不能既有数值型,又有字符型。
数组中下标的写法既可以用【】,也可以用{}或(),根据个人习惯。
数组中下表也可以是个范围,如arrat x[11:15] y11 y12 y13 y14 y15;。
数组中“下标”可以不写,而用*代替。如array 下【*】a b c;,SAS会自动根据变量个数来判断下标值为3.
数组中的“数组元素”可以不写,如array y[3];等同于array y[3] y1 y2 y3;.
元素初始值一定要用()括起来,各个值之间可以用逗号或空格隔开。
data missing;
set sasuser.xb;
array cha[1] name;
if missing(cha[1]) then output;
array num[10] gender age height weight time y1-y5;
do i=1 to 10;
if missing(num[i]) then output;
end;
proc print;
run;
set sasuser.xb;
array cha[1] name;
if missing(cha[1]) then output;
array num[10] gender age height weight time y1-y5;
do i=1 to 10;
if missing(num[i]) then output;
end;
proc print;
run;
data missing;
set sasuser.xb;
array cha[1] name;
if missing(cha[1]) then output;
array num[10] gender age height weight time y1-y5;
do i=1 to 10;
if missing(num[i]) then output;
end;
drop i;
proc print;
run;
set sasuser.xb;
array cha[1] name;
if missing(cha[1]) then output;
array num[10] gender age height weight time y1-y5;
do i=1 to 10;
if missing(num[i]) then output;
end;
drop i;
proc print;
run;
proc sort data=missing out=missing2 nodupkey;
by id;
proc print;
run;
剔除重复观测
by id;
proc print;
run;
剔除重复观测
补充内容-自动变量
_n_表示观测或记录的序号,如第一个观察_n_=1,第六个观测_n_=6。
_numeric_表示数据集中的所有数值型变量。
_character_表示数据集中的多有字符型变量。
_all_表示数据集中的所有变量。
_numeric_表示数据集中的所有数值型变量。
_character_表示数据集中的多有字符型变量。
_all_表示数据集中的所有变量。
data missing;
set sasuser.xb;
array cha[1] _character_ ;
if missing(cha[1]) then output;
array num[11] _numeric_ ;
do i=1 to 11;
if missing(num[i]) then output;
end;
proc print;
run;
set sasuser.xb;
array cha[1] _character_ ;
if missing(cha[1]) then output;
array num[11] _numeric_ ;
do i=1 to 11;
if missing(num[i]) then output;
end;
proc print;
run;
超值大礼包:查找缺失值的万能程序
dim()函数是专门针对数组的函数,它的作用是返回指定数组所含的元素个数。
如指定数组array x[*]a b c;则dim(x)返回值为3.
如指定数组array x[*]a b c;则dim(x)返回值为3.
data missing;
set sasuser.xb;
array cha[*] _character_ ;
do i=1 to dim(cha);
if missing(cha[i]) then output;
end;
array num[*] _numeric_ ;
do i=1 to dim(num);
if missing(num[i]) then output;
end;
proc print;
run;
set sasuser.xb;
array cha[*] _character_ ;
do i=1 to dim(cha);
if missing(cha[i]) then output;
end;
array num[*] _numeric_ ;
do i=1 to dim(num);
if missing(num[i]) then output;
end;
proc print;
run;
数据清洗-查找异常值
data 新数据集;
set 已有数据集;
if|where 条件语句;
proc print;
run;
set 已有数据集;
if|where 条件语句;
proc print;
run;
补充内容:if和where的区别
(1)在利用set语句有条件地复制数据集时,set后紧跟着条件句,此时用if和where都可以。
(2)if:使用SAS的自动变量时,只能用if,不能用where。
如果指定的条件变量时新产生的变量,只能用if,不能用where。
(3)where:当使用某些特殊运算符时,只能用where语句,不能用if。
特殊字符:between...and,contains"指定字符",like“指定字符”,is null或is missing
当我们调用某一proc 过程时,如果要选择部分观测执行该过程,只能用where语句,不能用if语句。
当作数据集选项使用时,只能用where.
(1)在利用set语句有条件地复制数据集时,set后紧跟着条件句,此时用if和where都可以。
(2)if:使用SAS的自动变量时,只能用if,不能用where。
如果指定的条件变量时新产生的变量,只能用if,不能用where。
(3)where:当使用某些特殊运算符时,只能用where语句,不能用if。
特殊字符:between...and,contains"指定字符",like“指定字符”,is null或is missing
当我们调用某一proc 过程时,如果要选择部分观测执行该过程,只能用where语句,不能用if语句。
当作数据集选项使用时,只能用where.
between ...and:指定介于数值变量两个值之间的观测。
contains "指定字符":指定字符型变量中包含指定字符的观测。
like"指定字符":指定字符变量中与指定字符相似的观测,模糊部分可用%或_代替,其中%代表多个符号,_代表1个字符。
is null或is missing:指定包括缺失值的观测。
contains "指定字符":指定字符型变量中包含指定字符的观测。
like"指定字符":指定字符变量中与指定字符相似的观测,模糊部分可用%或_代替,其中%代表多个符号,_代表1个字符。
is null或is missing:指定包括缺失值的观测。
超值礼包-查找异常值的万能程序
%let data=sasuser.xb; /*此处改为自己的数据集*/
%let id=id; /*此处改为数据集中表示id号的变量*/
%macro outline(var=,low=,high=);
data outline;
set &data.(keep=&id. &var.);
length variable $20. reason $20.;
variable="&var.";
value=&var.;
if &var.<&low. and not missing(&var.) then do;
reason="过低";
output;
end;
else if &var.>&high. and not missing(&var.) then do;
reason="过高";
output;
end;
drop &var.;
proc append base=outliner1 data=outline;
run;
%mend outline;
%outline(var=height,low=150,high=200);
%outline(var=weight,low=40,high=100);
%outline(var=y1,low=1,high=5);
%outline(var=y2,low=1,high=5);
%outline(var=y3,low=1,high=5);
%outline(var=y4,low=1,high=5);
%outline(var=y5,low=1,high=5);
proc print data=outliner1;
run;
%let id=id; /*此处改为数据集中表示id号的变量*/
%macro outline(var=,low=,high=);
data outline;
set &data.(keep=&id. &var.);
length variable $20. reason $20.;
variable="&var.";
value=&var.;
if &var.<&low. and not missing(&var.) then do;
reason="过低";
output;
end;
else if &var.>&high. and not missing(&var.) then do;
reason="过高";
output;
end;
drop &var.;
proc append base=outliner1 data=outline;
run;
%mend outline;
%outline(var=height,low=150,high=200);
%outline(var=weight,low=40,high=100);
%outline(var=y1,low=1,high=5);
%outline(var=y2,low=1,high=5);
%outline(var=y3,low=1,high=5);
%outline(var=y4,low=1,high=5);
%outline(var=y5,low=1,high=5);
proc print data=outliner1;
run;
缺失值的填补
缺失数据的填补
proc mi<out=数据集><round=><minimum=><maximum=>;
mcmc;
var 变量1 变量2 ...;
run;
mcmc;
var 变量1 变量2 ...;
run;
proc mi语句调用填补缺失值,Out=是把填补后的数据保存到自定义的数据集中;
round=填补缺失值的小数位数;
minimum和maximum是指定填补值的最大值和最小值。
round=填补缺失值的小数位数;
minimum和maximum是指定填补值的最大值和最小值。
data xb9;
set xb_revised;
if id=9 then delete; /*利用if和delete删除id=9的观测*/
run;
proc mi data=xb9 out=nomissing round=1 1 1 minimum=150 1 1 maximum=200 5 5;
mcmc;
var height y2 y4;
run;
proc print data=nomissing;
run;
set xb_revised;
if id=9 then delete; /*利用if和delete删除id=9的观测*/
run;
proc mi data=xb9 out=nomissing round=1 1 1 minimum=150 1 1 maximum=200 5 5;
mcmc;
var height y2 y4;
run;
proc print data=nomissing;
run;
缺失数据的更新
data 新数据集;
update 旧数据集 新数据集;
by 索隐变量;
run;
update 旧数据集 新数据集;
by 索隐变量;
run;
data xb_revised;
set sasuser.xb;
if id=6 then y3=1;
if id=7 then y5=5;
if id=9 then weight=56;
if id=10 then height=162;
proc print;
run;
set sasuser.xb;
if id=6 then y3=1;
if id=7 then y5=5;
if id=9 then weight=56;
if id=10 then height=162;
proc print;
run;
data newdata;
input id weight height y3 y5;
cards;
6 . . 1 .
7 . . . 5
9 56 . . .
10 . 162 . .
;
data xb_revised;
update sasuser.xb newdata;
by id;
proc print;
input id weight height y3 y5;
cards;
6 . . 1 .
7 . . . 5
9 56 . . .
10 . 162 . .
;
data xb_revised;
update sasuser.xb newdata;
by id;
proc print;
proc univariate data=nomissing noprint;
class id;
var height y2 y4;
output out=nm mean=height y2 y4;
run;
data newxb;
update xb9 nm;
by id;
height=round(height,1);
y2=round(y2,1);
y4=round(y4,1);
proc print data=newxb;
run;
class id;
var height y2 y4;
output out=nm mean=height y2 y4;
run;
data newxb;
update xb9 nm;
by id;
height=round(height,1);
y2=round(y2,1);
y4=round(y4,1);
proc print data=newxb;
run;
数据集选项
data aa;
input id x@@;
cards;
1 10 2 20 3 30
;
data bb;
set aa;
rename x=x1;
y=x+5;
run;
data aa;
input id x@@;
cards;
1 10 2 20 3 30
;
data bb(rename=(x=x1));
set aa;
y=x+5;
run;
data aa;
input id x@@;
cards;
1 10 2 20 3 30
;
data bb;
set aa(rename=(x=x1));
y=x+5;
run;
产生的与前两者不同
input id x@@;
cards;
1 10 2 20 3 30
;
data bb;
set aa;
rename x=x1;
y=x+5;
run;
data aa;
input id x@@;
cards;
1 10 2 20 3 30
;
data bb(rename=(x=x1));
set aa;
y=x+5;
run;
data aa;
input id x@@;
cards;
1 10 2 20 3 30
;
data bb;
set aa(rename=(x=x1));
y=x+5;
run;
产生的与前两者不同
通常作为选项时,是与set语句同时起作用的;而作为语句时,是在set语句执行之后才起作用的。
产生数据子集
产生特定记录的子集
1.选择具有相同特征的人群子集
data 新数据集;
set 已有数据集;
if|where 条件语句;
run;
set 已有数据集;
if|where 条件语句;
run;
选择连续记录的数据子集
proc print data=数据集(firstobs= obs=);
run;
run;
产生变量子集
0 条评论
下一页