tag 标签: sas数据整理经管大学堂:名校名师名课

相关日志

分享 转载--SAS数据整理的16个技巧
dream9876 2015-3-4 18:31
1、修改属性   attrib 2、根据条件删除记录    if 条件 then delete; 3、分拆数据集 data master missing; merge old new(in=x); by id; if x=0 then output missing; else output master; run; 4、利用attrib删去所有label data want; set have; attrib _all_ label=""; run; 5、keep 保留变量 data abc; set ad; keep name label; run; 6、drop 删除变量 data abc; set ad; drop name label; run; 7、Missing(),如果变量有缺失值,则返回真。 如 data test_miss;    set learn.blood;    if missing(Gender) then MissGender + 1;    if missing(WBC) then MissWBC + 1;    if missing(RBC) then MissWBC + 1;    if Chol lt 200 and not missing(Chol) then Level = 'Low ';    else if Chol ge 200 then Level = 'High';    run;    当变量名形如x1-x5,可以调用missing(of x1-x5).此种写法也可用于诸如sum等函数。 8、Ranuni.返回0到1的随机数。 若以0作为种子,SAS将以系统时间作为种子产生随机数。 9、Lag返回前一个观测值的函数。 看下面的代码    data look_back;    input Time Temperature;    Prev_temp = lag(Temperature);    Two_back = lag2(Temperature);    datalines;    1 60   2 62   3 65   4 70   ; 得到结果为    Listing of LOOK_BACK       Obs Time TemperaturePrev_temp Two_back    1   1   60   .   .    2   2   62   60   .    3   3   65   62   60    4   4   70   65   62    lag返回前一个观测值,lag2将返回往前数两个的观测值,不是指两个观测值。呵呵。 lag的 一般作用为计算两个变量的差值 。 将上例略微修改一下, 计算两天的温度差。    data diff;    input Time Temperature;    Diff_temp = Temperature – lag(Temperature);    datalines;    1 60   2 62   3 65   4 70;    当然更直接的用法是用Diff函数。    data diff;    input Time Temperature;    Diff_temp = dif(Temperature);    datalines;    1 60   2 62   3 65   4 70 ; 10.Compbl:将字符串中两个或两个以上的空格删除只剩一个空格(即 compress blank) 。 11.Compress删除空格或指定的字符。    假设有一个名为电话号码的变量,由于其来源的不同,导致格式多样。    Phone    (908)232-4856    210.343.4757    (516) 343 - 9293    9342342345    现在想去掉左右括号,点号和-号。    data phone;    length PhoneNumber $ 10;    set learn.phone;    PhoneNumber = compress(Phone,' ()-.');    drop Phone;    run;    compress的参数称为修饰语(modifier), 各个修饰语的意思如下 d   删除数字    a   删除大小写字符   、 i   忽略大小写    k   保留字符串    s   删除空格,制表符等    p   删除标点符号    例如   函数   作用   返回值    compress(String,,'a')删除所有字符串    compress(String,,'kd')删除除数字外的其它字符 compress(String,'wxyz','i')忽略大小写删除 wxyz compress("A?B C99",,'pd')删除标点符号和数字   AB C 11、连接字符串。||或者!!将连接两个字符串为一个字符串,其长度等于两个字符串长度之和。 比方说one=ABC,two=DEF,则one||Two将返回ABCDEF.   CAT函数 等同于||,除了返回的字符串的长度以外,其缺省值是200. Cats函数 在连接字符串前去掉字符串前面和后面的空格。 Catx类似于 Cats ,在去掉前后的空格后,会在连接的两字符串中间插入分隔符。 下述代码为其例子。    title "Demonstrating the Concatenation Functions";    data _null_;    Length Join Name1–Name4 $ 15;    First = 'Ron ';    Last = 'Cody ';    Join = ':' || First || ':';    Name1 = First || Last;    Name2 = cat(First,Last);    Name3 = cats(First,Last);    Name4 = catx(' ',First,Last);    file print;    put Join= /   Name1= /   Name2= /   Name3= /   Name4= /;   r un;    输出结果    Demonstrating the Concatenation Functions    Join=:Ron :    Name1=Ron Cody    Name2=Ron Cody    Name3=RonCody    Name4=Ron Cody 12、Find函数。其语法形式如下   find(string, find-string, modifiers, starting-position) data WORK.ONE; Text='Australia, US, Denmark';Pos=find(Text,'US','i',5); run; 【注意】 ,不管起始位置是多少,返回的位置数值始终是在源字符串中的位置。 13、字符串拆分函数Scan. Scan函数提出以空格或标点符号隔开的第n个单词。不同于trim,trim只是提取字符。 【功能】从字符表达式s中搜取给定的n个单词 【类别】 字符函数 【语法】 1. Scan(s,n) n为正数时,从字符s末尾提取n个字符 2. Scan(s,n) n为负数时,从字符s开始提取n个字符 【注意】 1. 如果缺失指定的生成变量的长度,系统默认长度为200. 2. 如果|n|=0或大于字符s的长度,则该函数返回空格。 【例子】 data a; arg='ABC.DEF(X=Y)'; word=scan(arg,3); put word; run; data b; arg='ABC.DEF(X=Y)'; word=scan(arg,-3); put word; r un; data c; arg='ABC.DEF(X=Y)'; word=scan(arg,-20); put word; run; data d; input Arr $ 22.; ArrivalGate=scan(Arr,1,' '); DepartureGate = scan(Arr,2,' '); put DepartureGate ArrivalGate arr; cards; Arrival DepartureGates ; run; 14、比较字符串函数Compare COMPARE(string–1, string–2,modifiers ) 选项说明 i 忽略大小写 l 去掉前导空格 n 取引号内部分比较 及忽略大小写 :将较长字符串截短与较短字符串等长 data test; infile datalines missover; input string1 $char8. string2 $char8. modifiers $char8.; result=compare(string1, string2, modifiers); datalines; 1234567812345678 123 abc abc abx xyz abcdef aBc abc aBc AbC i abc abc abc abc l abc abx abc abx l ABC 'abc'n ABC 'abc'n n '$12'n $12 n '$12'n $12 nl '$12'n $12 ln ; proc print data=test; run; 结果为 Obs string1 string2 modifiers result 1 12345678 12345678 0 2 123 abc -1 3 abc abx -3 4 xyz abcdef 1 5 aBc abc -2 6 aBc AbC i 0 7 abc abc -1 8 abc abc l 0 9 abc abx 2 10 abc abx l -3 11 ABC 'abc'n 1 12 ABC 'abc'n n 0 13 '$12'n $12 n -1 14 '$12'n $12 nl 1 15 '$12'n $12 ln 0 注意:nl和 ln结果不同, 15、模糊匹配函数Spedis. 例如    data fuzzy;    input Name $20.;    Value = spedis(Name,'Friedman');    datalines;    Friedman   Freedman   Xriedman   Freidman   Friedmann   Alfred   FRIEDMAN    ; run;    返回结果如下    Listing of FUZZY    Name   Value    Friedman    0    Freedman   12    Xriedman   25    Freidman    6    Friedmann   3    Alfred   100    FRIEDMAN   87    当两个字符串完全匹配时,将返回0. 第一个字符匹配错误,将比其它字符匹配错误所得的处罚分数更大。 16、字符串替换    函数Translate会替换某个字符,而Transwrd会替换某个单词 。 例如    data trans;    input Answer :$5. @@;    Answer = translate(Answer,'ABCDE','12345');    datalines;    14325   AB123   51492    ; run;    得到结果如下    Answer    ADCBE    ABABC    EAD9B    Tranwrd函数 经常用于标准化地址等,如以Street替换St.,以Road替换Rd.,等等。 例如 data _null_; string1=tranwrd('abcx apple abc', 'apple', 'pear'); put string1=; run; 结果为 string1=abcx pear abc
1 次阅读|0 个评论

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 16:17