存档

文章标签 ‘sas’

sas的TRANSPOSE过程详解

2010年8月16日 没有评论

今天我第一次用到sas里面的TRANSPOSE过程,为此我查了一些资料,发现网上有些文章写的不是很清楚。下面我谈谈sas里面的TRANSPOSE过程。本文只在sas8.2下调试通过。
先看图,有些简陋。

sas transpose过程说明图

TRANSPOSE过程能实现sas数据集的转置,所谓转置,就是把观测(行)变成变量(列),变量变为观测,如上图中,从表1变成表3。该过程从读入的一个数据集中,创建一个新的数据集。具体用法格式如下:

PROC TRANSPOSE
DATA=input-data-set  LABEL=label LET NAME=name OUT=output-data-set PREFIX=prefix
;
BY  variable-1
... variable-n
;
COPY variable(s);
ID variable;
IDLABEL variable;
VAR variable(s);

sas里的所有过程,都分为选项/option和声明statement两部分,在格式上,选项与过程名是一条语句,而每个声明单独成语句,也就是用分号分隔开。在程序运行上也一样,过程与选项一次性读入后分析。
很多时候,我们也许只用到几个选项,或者几个声明就实现了自己的目的,不过如果你能确切的了解每个过程的选项和声明,会让你的程序更加简洁易读。
以下是从sas support翻译过来的,并加入我自己的解释。

选项/Options

选项1:

DATA=input-data-set

需要进行转置的数据集的名字。 默认情况下,转置最近新建的数据集。

选项2:

LABEL= label

英文的表述是:指定新输出的数据集中新观测的变量的标签,默认是_LABEL_,但是经过我的测试,这个选项没有任何意义,也就是设置与否不起任何作用。

选项3:

LET

允许重复的ID变量,并且当重复时,以最后一个为准,所谓的id变量,就是类上图中表1中name的作用,一般来讲,它的值不允许重复,因为如果重复,会导致生成重复变量。

选项4:

NAME= name

指定新转置生成的数据集里新变量的名称。比如上图中转置后的表2和表三的第一列,也就是第一个变量的名称,如果不设置,会以name of former variable命名,设置后,该变量的标签名依然是name of former variable。我认为前面的label选项,就是用来设置该变量的标签的,但是设置后居然没有变化,不知道是我sas问题还是版本的问题。在上图表3中,我设置name为tnew,所以显示为tnew。在sas9.2版本中,改默认变量为_name_。

选项5:

OUT= output-data-set

输出数据集,也就是转置后的数据集的名称,默认以data后面加数字来命名。

选项6:

PREFIX= prefix

前缀,原来观测变成变量后的前缀,不设置,也就是默认情况下,这些变量会以col1,col2排列下去,有的sas版本会以var1, var2排列下去。设置后,会以设置的字符串后加上数字1、2,并以此排列下去。为便于识别变量,这个选型经常与声明里的id混合使用,如表3,就是使用了id声明与前缀选项的结果。
例程如下,你可以copy到sas里查看运行结果。

data a;
input name $ test1 test2 test3;
cards;
wyt 98 99 97
ycy 78 45 34
ynn 78 90 87
;
run;
proc transpose data=a  name=tnew label=n  out=b  let  ;
run;
proc print data=a;
run;
proc print data=b;
run;

声明/statement

下面是transpose过程的声明。声明使用的例程如下,比上面多的就是在选项之后,与run之间的声明部分。

data c;
input name $ test1 test2 test3;
cards;
wyt 98 99 97
ycy 78 45 34
ynn 78 90 87
;
run;
proc transpose data=a  name=tnew label=n  out=d  prefix=t let  ;
id name;
var name test1 test2;
copy test3;
 
run;
proc print data=d;
run;
proc print data=c;
run;

声明1:

BY  variable-1
<... variable-n>
;

下面这张图,很清楚指明了分组转置是怎么样一个过程,其中的DESCENDING是以降序排列,而NOTSORTED,是不排序。此声明没在sas8.2下测试。

声明2:

ID variable(s);

在前面说过,prefix经常与此声明共同使用,该声明的作用就是,把新生成数据集里的变量用id的值表示出来,如上图中的表三,就是应用了id后把id的值一一指定。在sas的很多过程里均有id的概念,该值一般不重复,因此可以指定为变量,在sas数据集里,观测可以重复,变量不能重复。另外,这个声明还经常与下面的声明仪器出现。

声明3:

IDLABEL variable;

用来指定上面对应变量的label,标签。

声明4:

VAR variable(s);

指明那几个变量进行转置,在本例子中,只讲test1与test2进行了转置,生成如下图的sas数据集。

声明5:

COPY variable(s);

这个声明用来原样拷贝源数据集中的某一个变量,原样不动的含义就是在新数据集里,改变量的值与源数据集中的一样,下面的例子,最后生成的数据集如下图所示,看着有点发懵,呵呵,在仔细看看就懂了

sas transpose statement


另外,当我要获取sas数据集的变量名并赋值给宏的时候,这篇文章帮了大忙,谢谢。具体内容转帖如下:
对一个数据集的变量进行分析,至少需要变量名,对吧。如果变量少,自已逐个输入也没问题,所谓忍一忍就和谐了。如果变量多呢,就无法忍受了–一个个地敲进去,不但麻烦,且易出错。解决之道有三种。

其一是读取表的dictionary.columns.Dictionary表里保存着库名及其成员的名字。以sashelp里的表class为例。

proc
sql;


create
table vars as

  
select varnum,name

  
from dictionary.columns

  
where memname=‘CLASS’;

quit;

其中varnum表示是第几个变量,name表示变量名。值得提醒的是,Dictionary里是以大写字母的形式保存表名。所以这里须要写CLASS

其二是读取SASHELP.VCOLUMN。以数据步读取的形式如下

data vars1;

set sashelp.vcolumn;

where memname=‘CLASS’;

keep varnum name;

run;

其三是利用过程proc contents。这个要来得比读取dictionary和sashelp.vcolumn灵活。

data vars1;

set sashelp.vcolumn;

where memname=‘CLASS’;

keep varnum name;

run;

如果需要将变量名赋给一个宏变量,以空格隔开。其例如下

proc
contents
data=sashelp.class


out=vars3(keep=varnum name)

     noprint;

run;

proc
sql

noprint;


select
distinct name

     into :classname separated by
‘ ‘

     from vars3

     order
by varnum;

quit;

可以用%put &classname;察看其宏变量。得到结果

Name Sex Age Height Weight

当然有时并不想所有的变量都赋给这个宏变量。比如只想取出第1个和第2个变量给宏变量。当然也好解决。

proc
sql
noprint;


select
distinct name

     into :classname separated by
‘ ‘

     from vars3

     where varnum in (1,2)

     order
by varnum;

quit;

注意加了行where varnum in (1,2).或者

proc
contents
data=sashelp.class(keep=Name Sex)


out=vars4(keep=varnum name)

     noprint;

run;

proc
sql
noprint;


select

distinct name

     into :classname separated by
‘ ‘

     from vars4    

     order
by varnum;

quit;

%put &classname;

也是一样的。

分类: 数据可视化 标签: ,

SAS变量输入输出格式控制

2010年7月18日 4 条评论

读朱世武老师的《SAS编程技术教程》,的确是一本不错的书籍,至少很适合我。因为对于我,对SAS算初窥门径,经常在编程的时候忘记一些函数,或者寻找软件的一些功能,这本书恰恰就是如此,作为刚刚入门的书籍并不好,但是作为参考书,很好,至少把很多函数和命令分门别类清晰的表述清楚了。其实国内的书籍都很少能够达到这个层次。这本书相对于SAS帮助文档来说,查阅比较方便,因为sas帮助文档不能搜索,而这本书更体现参考书的价值。

最近要处理大量的日期、和会计(带千位符)的数字,以前处理这类数据都是从excell导入的,操作之后发现,导入的数据有时会出现一些小问题,而且还要用insight一个个的编辑变量,比较麻烦,希望能够通过cards一次性录入。方便以后存储和备份,因为随着SAS应用越来越多,我更倾向于用SAS来创建、管理我的研究数据。为此,我阅读了朱老师关于变量输入与输出格式控制的内容,笔记如下:

    1、输入格式

输入格式是SAS系统用来读入数据值的一个指令。

输入格式形式

<$>  INFORMAT<W>.<D>

选项说明:

$ 字符格式
W 输入数据的列数
D 数值输入格式中保留小数的位数
Informat 用来规定数据的输入格式

通用规则:
所有输入格式必须包含一个点(.)作为名字的一部分;
对于省略W和D值的输入格式,使用系统缺省值。

    2、列格式输入
input @6 date ddmmyy10.  @+1 stocd $ 8.  oppr 8.2;

说明:从第6列开始以DDMMYY10.格式读入变量DATE, 第7列开始以长度为8的字符格式读入变量STOCD,然后以数值格式8.2读入变量OPPR。
查看都安装了那些模块,和一些系统信息。

    3、数值与字符相互转换的方法

字符转换数值

1
2
3
4
5
data;
x='98.6';
y=input(x, 4.);
put x= y=;
run;

说明:INPUT函数和w.d输入格式将X的字符值转换为一个数值Y。还有一个更简单的,将字符值转换为数值的方法。

1
2
3
4
5
data;
x='98.6';
y=x-0;
put x= y=;
run;

数值转换为字符

1
2
3
4
5
data;
x=2557898;
y=put(x, $8.);
put y;
run;

例中,用PUT函数得到正确结果,即字符型2557898.

1
2
3
4
5
data;
x=2557898;
y=put(x, $3.);
put y;
run;

例中,Y的结果为3E6.

4、读入会计格式字符
读入类似11,222.11格式的字符。

1
2
3
4
5
6
7
8
data a;
input x;
informat x comma12.4;
cards;
12,345.1234
22,345.1234
;
run;

当然,你可以按照下表,更换不同的输入格式以读入不同格式的数据。

其中,COMMAw.d 用于输入格式读入包含字符的数值,这些字符包括: 逗号、空格、 $、%、破折号、圆括号等。
5、输入输出日期
SAS系统存贮日期值为1960年1月1日到这个日期之间的天数。

1
2
3
4
5
6
7
data a;
input date mmddyy10.;
cards;
10-01-2002
10/01/2002
;
run;

此时,日期中存储的是天数,当使用insight等的时候,不直观,所以一般用下面的程序录入数据。

1
2
3
4
5
6
7
8
data a;
input date mmddyy10.;
format date yymmdd10.;
cards;
10-01-2002
10/01/2002
;
run;

当然,你还可以根据下表,输入不同格式的日期数据。

此时,存储的虽然仍然是天数,但是是根据您的要求显示了。还可以根据下面的表,设置具体的显示形式。

    5、PUT函数

PUT函数可将数值转换为字符(如前所述),但最常用的是改变变量的字符输出格式。
例1: 转换数值变量cc的值为三个字符的十六进制表达式。

1
2
3
4
5
data;
cc=16;
cchex=put(cc,hex3.);
put cc hex3.;
run;

结果为010.
例2: 将数值CC转换为字符值。

1
2
3
4
data;
cc=16;
cc=put(cc,3.);
run;

例3: 输出时美元符号放在数值前面,中间加上千分号。

1
2
3
4
data;
Netpay=1254.71;
put @53 netpay  dollar10.2;
run;

输出值为$1,254.71.

字符变量的输出格式可以查阅下表。

再一次感谢朱世武老师的总结。

分类: 数据可视化 标签: , ,

SAS8.2安装及学习笔记

2010年7月11日 没有评论

最近一直要用SAS分析数据,以前一直用SAS6.12,这次下载了SAS8.2,借这个机会把8.2给搞定。

    安装问题

安装很容易,只是在破解时间限制的时候,总是提示:

sashost.dll missing or has been opened

google了半天没有结果,后来到安全模式下运行,嗯,搞定。后来在搜索别的什么东西的时候,发现一个破解时间限制的办法,摘录如下,原文点这里

由于原来提供的SAS8.2破解方法是针对SP1的,所以导致现在用SP2的很多朋友无法成功破解时间限制,现经过测试将方法提供给大家。
本人不提倡使用盗版软件,但有时为了学习的方便或了解某个软件的目的,偶尔使用一下盗版还是可以的:

1. XP+SP1:
将时间调到2002年8月1日前—->安装,licence就指向这个setinit.sss—>完后,运行Patcher,时间限制就可以取消了。

2.XP+SP2:
将时间调到2002年8月1日前—->安装,licence就指向这个setinit.sss—>完后,必须进入SAFE MODE模式,然后运行Patcher,才可以成功破解日期限制。

  • 我在这里加上一句,有条件请使用正版软件。
    • 2、SAS几种常见的图形操作界面

    分析员(Analyst):和SPSS操作类似,有助于学习SAS语句;
    SAS/INSIGHT: 可视化的数据探索工具,将统计方法与交互式图形显示融合在一起;
    SAS/ASSIST: 全面的图形操作界面,包括SAS在数据管理、统计分析、绘图等方面常见的功能;
    SAS/LAB: 半自动化图形操作界面,可帮助初学者快速熟悉SAS系统。

      3、SAS的solutions菜单

    相比SAS6.2,新版本增加了solutions菜单,其集成了许多SAS的模块入口,比如Analyst, Design of experiments et al.而且,这里的Accessories里面有六个有趣的小游戏。

      4、其他小东西

    Length一般出现在变量定义之前;
    Format指定格式要在input之前;

    分类: 数据可视化 标签: