统计211

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3361|回复: 0
打印 上一主题 下一主题

SAS数据整理的16个技巧

[复制链接]
跳转到指定楼层
1
发表于 2011-7-1 13:39:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       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
  Prev_
  Obs Time Temperature 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)。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')删除所有字符串
  123
  compress(String,,'kd')删除除数字外的其它字符
  123
  compress(String,'wxyz','i')忽略大小写删除 wxyz
  123
  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= /;
  run;
  输出结果
  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)
  13、字符串拆分函数Scan.Scan函数提出以空格或标点符号隔开的第n个单词。不同于trim,trim只是提取字符。
  14、比较字符串函数Compare
  15、模糊匹配函数Spedis.例如
  data fuzzy;
  input Name $20.;
  Value = spedis(Name,'Friedman');
  datalines;
  Friedman
  Freedman
  Xriedman
  Freidman
  Friedmann
  Alfred
  FRIEDMAN
  ;
  返回结果如下
  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
  ;
  得到结果如下
  Answer
  ADCBE
  ABABC
  EAD9B
  Tranwrd经常用于标准化地址等,如以Street替换St.,以Road替换Rd.,等等。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享1 分享淘帖 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


免责声明|关于我们|小黑屋|联系我们|赞助我们|统计211 ( 闽ICP备09019626号  

GMT+8, 2025-4-19 11:46 , Processed in 0.079991 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表