1. 首页
  2. R语言

【学习】七天搞定SAS(二):基本操作(判断、运算、基本函数)

【学习】七天搞定SAS(二):基本操作(判断、运算、基本函数)

SAS生成新变量

SAS支持基本的加减乘除,值得一提的是它的**代表指数,而不是^。

1

2

3

4

5

6

7

8

9

10

11

12

13

* Modify homegarden data set with assignment statements;

DATA homegarden;

INFILE ‘c:MyRawDataGarden.dat’;

INPUT Name $ 17 Tomato Zucchini Peas Grapes;

Zone = 14;

Type = ‘home’;

Zucchini = Zucchini * 10;

Total = Tomato + Zucchini + Peas + Grapes;

PerTom = (Tomato / Total) * 100;

RUN;

PROC PRINT DATA = homegarden;

TITLE ‘Home Gardening Survey’;

RUN;

但是如果有缺失值的话,SAS的加法会生成缺失值而不是自动按0处理。为了避免这一点,应该调用sum()函数而不是直接写+。

SAS的函数调用很简单:

1

2

3

AvgScore = MEAN(Scr1, Scr2, Scr3, Scr4, Scr5);

DayEntered = DAY(Date);

Type = UPCASE(Type);

函数有文本类、数字类、日期类等等。

SAS文本类函数

  • ANYALNUM(arg,start):返回第一次出现任意数字或字母的位置,可选开始位置start。

  • ANYALPHA(arg,start):返回第一次出现任意字母的位置,可选开始位置start。

  • ANYDIGIT(arg,start):返回第一次出现任意数字的位置,可选开始位置start。

  • ANYSPACE(arg,start):返回第一次出现任意空白的位置,可选开始位置start。

  • CAT(arg-1,arg-2,…arg-n):连接字符串,留下头尾空白。

  • CATS(arg-1,arg-2,…arg-n):连接字符串,删除头尾空白。

  • CATX(‘separator-string’, arg-1,arg-2,…arg-n):连接字符串,删除头尾空白并用指定标点连接。

  • COMPRESS(arg, ‘char’):移除字符串中的空格和可选字符。

  • INDEX(arg, ‘string’) :返回指定字符在变量中的位置。

  • LEFT(arg) :字符串左对齐。

  • LENGTH(arg):返回字符串长度,不考虑尾部空格。

  • PROPCASE(arg) :首字母大写。

  • SUBSTR(arg,position,n):从字符串中提取指定开始位置指定长度字符。

  • TRANSLATE(source,to-1, from-1,…to-n,from-n):替换字符。

  • TRANWRD(source,from,to) :替换字符串。

  • TRIM(arg):删除尾部空白。

  • UPCASE(arg):替换成大写。

SAS数值函数

  • INT(arg):返回整数。

  • LOG(arg):自然对数。

  • LOG10(arg) :10为底对数。

  • MAX(arg-1,arg-2,…arg-n) :最大值

  • MEAN(arg-1,arg-2,…arg-n) :均值

  • MIN(arg-1,arg-2,…arg-n) :最小值

  • N(arg-1,arg-2,…arg-n) :非缺失值个数

  • NMISS(arg-1,arg-2,…arg-n) :缺失值个数。

  • ROUND(arg, round-off-unit) :保留几位小数。

  • SUM(arg-1,arg-2,…arg-n):求和。

SAS日期函数

  • DATEJUL(julian-date) :标准julian日期到SAS日期。

  • DAY(date):返回「日」。

  • MDY(month,day,year) :年月日到SAS日期。

  • MONTH(date) :返回「月」。

  • QTR(date):返回季度。

  • TODAY():今日

  • WEEKDAY(date):返回周几(周日为1)。

  • YEAR(date):返回「年」。

  • YRDIF(start-date,end- date,’ACTUAL’):返回相差年份。

SAS中判断语句

如果,则:

1

IF then: IF Model = ‘Mustang’ THEN Make = ‘Ford’;

还可以执行多项命令,需要嵌套do;可以用and和or:

1

2

3

4

5

IF Year IF Model = ‘Corvette’ OR Model = ‘Camaro’ THEN Make = ‘Chevy’;

IF Model = ‘Miata’ THEN DO;

Make = ‘Mazda’;

Seats = 2;

END;

还可以if else:

1

2

IF Cost = . THEN CostGroup = ‘missing’;

ELSE IF Cost ELSE IF Cost ELSE CostGroup = ‘high’;

用if可以选择数据子集:

1

IF Sex = ‘f’; IF Sex = ‘m’ THEN DELETE;

SAS中保留和累加

比如要求累加值(等价于R里面的cumsum),需要:

1

2

3

4

5

6

7

8

9

10

11

* Using RETAIN and sum statements to find most runs and total runs;

DATA gamestats;

INFILE ‘c:MyRawDataGames.dat’;

INPUT Month 1 Day 34 Team $ 625 Hits 2728 Runs 3031;

RETAIN MaxRuns;

MaxRuns = MAX(MaxRuns, Runs);

RunsToDate + Runs;

RUN;

PROC PRINT DATA = gamestats;

TITLE "Season’s Record to Date";

RUN;

看一眼最终数据:

【学习】七天搞定SAS(二):基本操作(判断、运算、基本函数)

累加效果出来了~还有一栏是迄今最大值。这也是我觉得sas和R很不同的一点:sas是指针式操作,一行行往下读;而在R里面我们更多是向量或者矩阵式运算,感觉还是有所区别的…

SAS的数组操作

这个就更有点矩阵的味道了,不过还是偶尔感觉怪怪的…感觉数据整理和操纵方面,SAS还是比不上R灵活…

例子为替换为缺失值:

1

2

3

4

5

6

7

8

9

10

11

12

* Change all 9s to missing values;

DATA songs;

INFILE ‘c:MyRawDataWBRK.dat’;

INPUT City $ 115 Age domk wj hwow simbh kt aomm libm tr filp ttr;

ARRAY song (10) domk wj hwow simbh kt aomm libm tr filp ttr;

DO i = 1 TO 10;

IF song(i) = 9 THEN song(i) = .;

END;

RUN;

PROC PRINT DATA = songs;

TITLE ‘WBRK Song Survey’;

RUN;

这样9就全部替换为缺失值了。把后面10列认为是一个数组,可以直接操作。

SAS还有若干变量名的快捷方式,暂不赘述了…

原文始发于微信公众号(PPV课数据科学社区):【学习】七天搞定SAS(二):基本操作(判断、运算、基本函数)

原创文章,作者:ppvke,如若转载,请注明出处:http://www.ppvke.com/archives/29772

联系我们

4000-51-9191

在线咨询:点击这里给我发消息

工作时间:周一至周五,9:30-18:30,节假日休息