楼主: 进行式
10245 17

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

  • 1关注
  • 0粉丝

本科生

96%

还不是VIP/贵宾

-

威望
0
论坛币
43 个
通用积分
0
学术水平
1 点
热心指数
0 点
信用等级
1 点
经验
1011 点
帖子
67
精华
0
在线时间
129 小时
注册时间
2013-12-17
最后登录
2019-5-24

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
数据集是一个基因型数据。每一行都有3中基因型两个纯合子,一个杂合子。如AA、AG、GG或者是CC、CG、GG我想把AA、CC替换为0,AG、CG替换为1、GG替换为2。每一行观测都是只有三种可能即两个纯合子、一个杂合子,纯合子的类型不同。改如何写程序呢?多谢指教!数据结构如图所示
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sas数据集 江湖救急 观测值 数据集 如图所示 江湖 如何

34TBAWG_(K_NOR~LXH7OBVF.jpg (165.07 KB)

34TBAWG_(K_NOR~LXH7OBVF.jpg

沙发
larry_dh 发表于 2014-5-1 19:01:52 |只看作者 |坛友微信交流群
你的没有贴数据,我模拟了一下。将变量值放到数组里面,数组变量就是你需要修改的变量名(代码里我写的比较马虎),然后用if语句逐个查找,修改。没有完全造你以的要求修改,这做法是可行的 你稍微修改下if条件语句就可以了。我也是初学者,就会这么点。
  1. data new(drop=i);                                                                                                                       
  2. infile 'C:\Users\lenovo\Desktop\1.txt';                                                                                                
  3. input _10001 $ _1000122 $ _1000034 $;                                                                                                   
  4. array sample{3} _10001 _1000122 _1000034;                                                                                               
  5. do i=1 to 3;                                                                                                                           
  6. if sample{i}='AG' then sample{i}=1;                                                                                                     
  7. else if sample{i}='AC' then sample{i}=2;                                                                                                
  8. else sample{i}=3;                                                                                                                       
  9. end;                                                                                                                                    
  10. run;                                                                                                                                    
  11. proc print data=new noobs;                                                                                                              
  12. run;   
复制代码
结果:
1.JPG

使用道具

藤椅
Aharach 发表于 2014-5-1 23:39:04 |只看作者 |坛友微信交流群
proc format 可能更快一点

使用道具

板凳
苹果叶 在职认证  发表于 2014-5-2 00:25:41 |只看作者 |坛友微信交流群
按我的理解,这个case 主要是变量名不规范,假如是从文件读入,getname = no ,然后用array 应该可以了

使用道具

报纸
进行式 发表于 2014-5-2 10:10:25 |只看作者 |坛友微信交流群
larry_dh 发表于 2014-5-1 19:01
你的没有贴数据,我模拟了一下。将变量值放到数组里面,数组变量就是你需要修改的变量名(代码里我写的比较 ...
恩恩,多谢了哈。可是我的数据集里有2000多个变量,那该怎么写呢?原谅我对SAS一窍不通,我上传了一个20行20列的子集能帮我看下吗?多谢了

gene.txt

157.56 KB

使用道具

地板
进行式 发表于 2014-5-2 10:47:56 |只看作者 |坛友微信交流群
Aharach 发表于 2014-5-1 23:39
proc format 可能更快一点
恩,谢谢指导!能帮我看下改怎么写程序吗?我对SAS是一窍不通,附件上传了一个小的数据集。多谢了哈

使用道具

7
苹果叶 在职认证  发表于 2014-5-2 14:24:18 |只看作者 |坛友微信交流群
  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. data final;
  10.   set gene;
  11.   array var{2181};
  12.   do i = 2 to 2181;
  13.          if var{i} in ('AA' 'CC') then var{i} = '0';
  14.     else if var{i} in ('AG' 'CG') then var{i} = '1';
  15.     else if var{i} in ('GG'     ) then var{i} = '2';
  16.   end;
  17.   drop i;
  18. run;
复制代码


所有变量都是字符型,如果需要数值型,再转换下就可以

使用道具

8
进行式 发表于 2014-5-2 16:38:17 |只看作者 |坛友微信交流群
苹果叶 发表于 2014-5-2 14:24
所有变量都是字符型,如果需要数值型,再转换下就可以
谢谢大神!很给力啊,一下就出来了。但是还有个问题,因为AA与CC要替换的值也不同啊,AA是0,CC就只能是2了,CC是2又跟GG一样了。该怎么修改呢?因为杂合的类型一共有AC、AG、AT、CG四种,他们的赋值都是1。就是相同两个会弄混,数据集的每一行都只有3种观测如AA、AC、CC,就是要把AA、CC也赋不同的值。

使用道具

9
进行式 发表于 2014-5-2 17:01:49 |只看作者 |坛友微信交流群
苹果叶 发表于 2014-5-2 14:24
所有变量都是字符型,如果需要数值型,再转换下就可以
可不可以按行来替换呢?提取观测值的字符串,如果第一个字符是A第二个字符为C,就变为1。第一个字符是A,第二个字符也是A就变位2,其他的也一样。主要是想把每行的3种观测值用0,1,2区分出来。

使用道具

10
苹果叶 在职认证  发表于 2014-5-2 18:11:18 |只看作者 |坛友微信交流群
进行式 发表于 2014-5-2 17:01
可不可以按行来替换呢?提取观测值的字符串,如果第一个字符是A第二个字符为C,就变为1。第一个字符是A, ...
  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 format;
  10.   invalue C2N
  11.     'AA'  = 1
  12.         'CC'  = 2
  13.         'GG'  = 3
  14.         'TT'  = 4
  15.         '--' = .
  16.         other = 0
  17.   ;
  18. run;

  19. data final;
  20.   set gene;
  21.   array var{2181} $;
  22.   array col{2181};
  23.   do i = 2 to 2181;
  24.     col{i} = input(var{i},C2N.);
  25.   end;
  26.   drop i var2-var2182 col1;
  27. run;
复制代码
如果可以多设几个值,就这样吧。如果纯合子只能1,2 就比较麻烦了。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 14:57