Data步双output、双set的妙用

前两天在一个SAS QQ群上碰到一个处理数据实际问题,觉得挺有意思的,分享给大家。

问题:“sxlion:   你好!

我的问题是要把ML.ped文件里面的全部按照文件ML.bim改为1和2. 修改的标准为:
 ML.ped的列数为ML.bim的2倍.
如果ML.ped的2n-1或2n列等于ML.bim表的第n列的第一个字母,那么ML.ped的2n-1或2n列就为1,否则为2.
 modi.txt是我修改的部分数据,通过这样的程序来实现:
 data ML1;
  set ML;
array geno{86} _all_;
  if geno{1}=”A” then var7=1 ; else  var7=2;
if geno{2}=”A” then var8=1 ; else  var8=2;
  if geno{3}=”T” then var9=1 ; else  var9=2;
if geno{4}=”T” then var10=1 ; else  var10=2;
.
.
.
run;
冬末”
三个数据附件:ML.ped   ML.bim modi.txt (点击数据下载地址 均可用记事本打开)。
思路:看了冬末给的代码,能了解个大概的意思,可能需要宏把“if … then … else …”用宏代替,不过还得看懂数据,了解实际需求。我把数据ml.ped打开一看,发现里面是字段是A,G,T,C,哈哈,这不是DNA的碱基么,嘌呤,嘧啶什么的,挺有意思的,估计是与基因排列规律的有关数据,然后继续查看ml.bim,里面也是些AGTC字母,应该是参考碱基序列。最后看看目标数据modi.txt,只有部分修改好的。拿到数据的第一反应是,数据查询,用select into 建立宏变量列表解决这个问题,后来发现有个列数倍数的问题,实现起来需要嵌套宏,难度加大比较麻烦,放弃;还想到hash大杀器。。。
对于SAS来说,如果一个简单的问题(因为数据量太小了),动用太高级的武器是不值得的。后来想想双set不是能很好的解决这个问题么? 只是在构造循环的时候需要考虑2倍的问题。 如果问题能进一步简化,不是更好吗 ?  把一个观察值重复两遍的比较,如果构建一个重复不就可以了,于是双output就用上了。于是敲了几行代码,解决了。
解决代码:

data mlped;
input var1 :$5. var2 :$5. (var3-var92) (~$1.) ;
cards;

H1000 H1000 0 0 1 2 A G T C T C G A T C C T T A C T T C T C G A A G T C C T C G A C T C C A A … G
H1003 H1003 0 0 1 2 A G T T T C G G 0 0 0 0 0 0 0 0 C C T T 0 0 G G 0 0 C C G G A A T T C C T…  C
…/*将ML.ped数据复制过来*/

H1004 H1004 0 0 1 2 A G T C T C G A T C C T T A C T T C T C G A A G T C C T C G A C T C C A  C … C G

;
run;

data mlbim;
input a $4.@@; output; output;  /*双output构建新的查询数据*/
if _N_ = 43 then stop;
cards;
A T T G T C T C T T G A T C C A T C A A A G G G G T C C T A G C C C G C C G A T G T C
G C C A C T A T C C A G C T G C C A T G G A A A A C T T C G A T G G A T T A G C A G G
;
run;

data modi;
set mlped;
array geno[86] var7-var92;
array newgeno[86] nvar7-nvar92;
do i= 1 to 86 ;
set mlbim point=i;    /*双set ,使用point定位查询数据集ml.bim */
if geno[i]=a then newgeno[i]=1 ;else newgeno[i]=2;
end;
output;
run;

proc print data=modi;
var nvar7-nvar92;
run;

运行结果:

NOTE: 从数据集 WORK.MLPED. 读取了 2020 个观测
NOTE: 数据集 WORK.MODI 有 2020 个观测和 179 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.04 秒
CPU 时间 0.03 秒

运行结果非常快,结果与给的参考结果modi.txt一致,Bingo!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>