您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文档 > 读书笔记littlesas第23章SAS数据集重组
第23章SAS数据集的重组目录第23章SAS数据集的重组............................................................................................................123.1简介.................................................................................................................................123.2用DATA步完成转换一个对象对应一条观测到一个对象对应多条观测................123.3用DATA步完成转换一个对象对应多条观测到一个对象对应一条观测.................323.4用PROCTRANSPOSE过程完成转换一个对象对应一条观测到一个对象对应多条观测..............................................................................................................................................423.5用PROCTRANSPOSE过程完成转换一个对象对应多条观测到一个对象对应一条观测..............................................................................................................................................523.1简介结构重组是指下面两个数据集的相互转换:每个对象对应一条观测,每个对象对应多条观测。我们为什么需要这种转换呢?因为当一个对象对应一条记录时,一些算法更容易执行。而另外一些算法更容易执行一个对象多条记录的这类数据。方法是用DATA步或者是PROCTRANSPOSE.23.2用DATA步完成转换一个对象对应一条观测到一个对象对应多条观测数据集名字为oneper,一个对象对应三个诊断代码(DX1-DX3).下面是数据集的展示注意到,一些对象有三个诊断代码,一些有两个,一些有一个(对象004)。怎样获得诊断代码的频率分布?例如,对象001在第三个诊断取值410,对象001在DX1有相同的取值。如果数据集结构被调整成这样,问题可能更好回答。程序23-1datalearn.manyper;setlearn.oneper;arrayDX{3};dovisit=1to3;ifmissing(DX{visit})thenleave;diagnosis=DX{visit};output;end;keepsubjdiagnosisvisit;run;下面来描述一下SAS程序工作的细节。DO循环开始时,visit的值是1,MISSING函数看是否缺失值。对于对象001,没有缺失的诊断代码,因此对这个对象if语句永远不为真。一个新的变量,,diagnosis,被设置等于数组元素DX{1},和变量DX1有相同的值,为450。到这里,程序数据向量为(PDA)为由于keep语句,在DO循环的底部,只有变量subj,visit,diagnosis被写到数据集manyper里面接着是下一条DO循环,visit等于2,diagnosis等于430,这些值被输出到数据集manyper中的第二条观测。最后,visit等于3,diagnosis等于410,这些值被输出到数据集manyper中的第三条观测。数据部现在到达底部,由于oneper数据集没到达文件的最后,oneper数据集中一条新的观测到了PDV中,过程继续。当DO循环到达对象002的第3个visit,DX{3}是缺失值,MISSING函数返回一个真值,LEAVE语句执行。一个LEAVE语句执行意味着DO循环伸出一个分支,跳到DO循环的第一个状态(output没有执行)。这意味着下一条DX不为缺失的记录将覆盖这个DX缺失的记录。23.3用DATA步完成转换一个对象对应多条观测到一个对象对应一条观测程序23-2从一个对象对应多条记录变为一个对象对应一条记录datalearn.oneper;setlearn.manyper;bySubjVisit;arrayDx{3};retainDx1-Dx3;iffirst.Subjthencallmissing(ofDx1-Dx3);Dx{Visit}=Diagnosis;iflast.Subjthenoutput;keepSubjDx1-Dx3;run;首先,要按照subjvisit排序(里面已经按顺序排好了,但通常情况下,先要排一下)。然后设置数值去保存三个DX的值,并retain这三个值。你需要retain这三个变量是因为这三个变量不是来自于不是来自于一个SAS数据集,在默认情况下,一条循环读完后会变为缺失值。而retain语句可防止这个事情发生,如当我读完第一条观测值,DX1有值,DX2,DX3缺失。读第二条值,DX1的值依然保留着,于是DX1,DX2有值,DX3缺失。当读完第三条,DX1,DX2,DX3都有值(一个subj的读取结束了)。然后,当你开始处理第一个visit的时候(一个新的subj开始了),设置DX的3个取值为缺失值。如果你不这样做,如果这个对象visit的个数小于3,将会从之前的的DX取值。CALLMISSING函数完成了这项任务。然后,你指定DX合适的值。23.4用PROCTRANSPOSE过程完成转换一个对象对应一条观测到一个对象对应多条观测PROCTRANSPOSE也可以用于SAS数据集结构的调整。有时候PROCTRANSPOSE提供一个又快又简单的方法,有时候PROCTRANSPOSE方法会更复杂。通常,数据部能够提供更多的。在程序23-4中你将看到,为了获得和DATA步相同的结果,你需要增加一些数据集选项。程序23-3用PROCTRANSPOSE将一个对象对应一条观测的数据集转换为一个对象对应多条观测的数据集。proctransposedata=learn.oneperout=manyper;bysubj;varDX1-DX3;run;结果展示这几乎就是你想要的了,现在需要做的就是重新命名COL1列为Diagnosis,移除变量_NAME_,移除DX为缺失值的观测。所有这些目标可以通过输出数据集选项来完成。程序23-4proctransposedata=learn.oneperout=manyper(rename=(col1=diagnosis)drop=_name_where=(diagnosisisnotnull));bysubj;varDX1-DX3;run;23.5用PROCTRANSPOSE过程完成转换一个对象对应多条观测到一个对象对应一条观测程序23-5proctransposedata=learn.manyperprefix=DXout=oneper(drop=_name_);bysubj;idvisit;vardiagnosis;run;其中的PREFIX=过程选项和ID语句产生一个等同于程序23-2的输出数据集。PREFIX=选项是前缀值(DX)和VISIT值(1,2和3)产生三个变量DX1,DX2,DX3。
本文标题:读书笔记littlesas第23章SAS数据集重组
链接地址:https://www.777doc.com/doc-2074197 .html