楼主: 进行式
11262 17

[问答] 江湖救急:如何替换SAS数据集中的观测值 [推广有奖]

11
进行式 发表于 2014-5-2 18:37:16
苹果叶 发表于 2014-5-2 18:11
如果可以多设几个值,就这样吧。如果纯合子只能1,2 就比较麻烦了。
恩,谢谢哈。纯合子只能是0、2,还有什么好的办法吗

12
进行式 发表于 2014-5-2 18:40:41
进行式 发表于 2014-5-2 18:37
恩,谢谢哈。纯合子只能是0、2,还有什么好的办法吗
就是只能用0、1、2、3个数字替换

13
苹果叶 在职认证  发表于 2014-5-2 20:00:51
进行式 发表于 2014-5-2 18:40
就是只能用0、1、2、3个数字替换
  1. proc import datafile = 'C:\Users\XXX\Desktop\gene.txt'
  2.   dbms = dlm
  3.   out  = gene
  4.   replace;
  5.   delimiter = '09'x;
  6.   getnames  = no;
  7.   datarow   = 2;
  8. run;

  9. proc transpose data = gene out = trans_gene;
  10.   var var2-var2181;
  11. run;

  12. proc format;
  13.   value $C2N
  14.     'AA'  = '1'
  15.     'CC'  = '2'
  16.     'GG'  = '3'
  17.     '--'  = '--'
  18.     other = '0'
  19.   ;
  20. run;

  21. data trans_gene1;
  22.   set trans_gene;
  23.   array col{20};
  24.   do i = 1 to 20;
  25.     col{i} = put(col{i},C2N.);
  26.   end;
  27.   drop i;
  28. run;

  29. %macro tranwrd;
  30.   %do i = 1 %to 20;

  31.     proc sql noprint;
  32.       select distinct col&i. into :values separated by '' from trans_gene1
  33.           order by col&i.;
  34.     quit;

  35.     %if %sysfunc(compress("&values",'-')) ne '012' %then %do;
  36.           data trans_gene1;
  37.             set trans_gene1;
  38.              if compress("&values",'-') = '013' then col&i. = tranwrd(col&i.,'3','2');
  39.         else if compress("&values",'-') = '023' then col&i. = tranwrd(col&i.,'3','1');
  40.           run;
  41.     %end;

  42.   %end;
  43. %mend;

  44. %tranwrd;

  45. proc transpose data = trans_gene1 out = final;
  46.   id _name_;
  47.   var col1-col20;
  48. run;

  49. data final;
  50.   merge gene final;
  51.   drop _name_;
  52.   rename var1 = snpname;
  53. run;
复制代码
我的方法比较笨,先转置,把3改成0 或者 2, 再转置回来。  

14
进行式 发表于 2014-5-2 21:14:05
苹果叶 发表于 2014-5-2 20:00
我的方法比较笨,先转置,把3改成0 或者 2, 再转置回来。
恩,十分感谢您的帮助。可是突然发现这种思路始终还是分不开纯合子,因为只能是0、1、2三个数字代替。就比如AG型里纯合为AA=0,GG=2,AC型里AA=0,CC=2,而CG型里CC=0,GG=2,这种方法没法区别每一行的CC和GG。所以我在想是不是可以通过字符串来修改?无论在哪一行里,第一个识别出的两个相同字符为,不同为0,第二个识别出的相同字符为2.但是具体的程序不知道怎么写?再次感谢您的帮助!

15
苹果叶 在职认证  发表于 2014-5-2 22:38:26
进行式 发表于 2014-5-2 21:14
恩,十分感谢您的帮助。可是突然发现这种思路始终还是分不开纯合子,因为只能是0、1、2三个数字代替。就比 ...
按你的想法,其实我的程序也可以分出来了,AA=1, CC=2 这两种是永远不变的,变的其实只是GG

比如某一行有 AA,GG,CG, 那么AA=1,CG=0,则GG=2
另一行有 CC, GG, AG, 那么 CC =2 ,AG=0,则GG=1

16
苹果叶 在职认证  发表于 2014-5-2 22:38:59
进行式 发表于 2014-5-2 21:14
恩,十分感谢您的帮助。可是突然发现这种思路始终还是分不开纯合子,因为只能是0、1、2三个数字代替。就比 ...
按你的想法,其实我的程序也可以分出来了,AA=1, CC=2 这两种是永远不变的,变的其实只是GG

比如某一行有 AA,GG,CG, 那么AA=1,CG=0,则GG=2
另一行有 CC, GG, AG, 那么 CC =2 ,AG=0,则GG=1

17
进行式 发表于 2014-5-3 09:38:44
苹果叶 发表于 2014-5-2 22:38
按你的想法,其实我的程序也可以分出来了,AA=1, CC=2 这两种是永远不变的,变的其实只是GG

比如某一行 ...
恩,多谢了!我再试试

18
进行式 发表于 2014-5-3 17:31:22
进行式 发表于 2014-5-3 09:38
恩,多谢了!我再试试
还有个小问题想向您请教,我想保留一个数据集中含某一特定观测值的变量,改怎么写程序呢?谢谢哈

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 17:31