免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2831 | 回复: 8
打印 上一主题 下一主题

新手第一个帖子:转换格式,求大神给个意见 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-26 05:26 |只看该作者 |倒序浏览
本帖最后由 小风0000 于 2016-04-26 11:13 编辑

求大家给个流程,怎么解决这个问题?找了好久还是解决不了。
按本人的想法是,把dat2做成个矩阵,然后对dat1文件进行迭代,每次按da2进行替换。但是第一步就出现问题:怎么读入数据,转换成矩阵?

dat1:
ind1        2202220
ind2        2222002
ind3        2222002
ind4        1221102
ind5        2222002
ind6        2212111
ind7        2202210
ind8        1221102
ind9        2222002
ind10        2222002

dat2:
SNPID_600K,Allele_0,Allele_1
snp1,A,C
snp2,A,G
snp3,A,G
snp4,T,C
snp5,T,C
snp6,T,C
snp7,A,G

dat1有10000行,2列,第2列有428896个数字。
dat2有428896行,3列。

现在要根据dat1第2列的数字转换成字符,以dat1的第2列的第1个数字为例,数字2按dat2里的第3列转换成C C。如果数字为1则按第2和第3列,转换成A C。如果数字为0,则按第2列转换成A A。
最后输出的格式为:
ind1 C C G G A A C C C C C C A A
ind2 C C G G G G C C T T T T G G

论坛徽章:
0
2 [报告]
发表于 2016-04-26 08:28 |只看该作者
本帖最后由 Hadron74 于 2016-04-26 08:30 编辑

一看你也是学生物信息的。

按我的理解,dat1的列应该对应dat2的行吧,所以你的输出格式的例子有误。
如果这样,程序如下:
  1. dat1 = """ind1        2202220
  2. ind2        2222002
  3. ind3        2222002
  4. ind4        1221102
  5. ind5        2222002
  6. ind6        2212111
  7. ind7        2202210
  8. ind8        1221102
  9. ind9        2222002
  10. ind10        2222002"""

  11. dat2 = """snp1,A,C
  12. snp2,A,G
  13. snp3,A,G
  14. snp4,T,C
  15. snp5,T,C
  16. snp6,T,C
  17. snp7,A,G"""

  18. snps = []
  19. for line in dat2.split("\n"):
  20.     snp,a0,a2=line.rstrip().split(",")
  21.     snps.append((a0,a2))

  22. d1={}
  23. import re
  24. for line in dat1.split("\n"):
  25.     ind,values =re.split("\s+",line.rstrip())
  26.     bases = []
  27.     for i, v in enumerate(values):
  28.         s = snps[i]
  29.         if v == "1":
  30.             bases.append(s[0])
  31.             bases.append(s[1])
  32.         elif v == "2":
  33.             bases.append(s[1])
  34.             bases.append(s[1])
  35.         elif v == "0":
  36.             bases.append(s[0])
  37.             bases.append(s[0])
  38.         else:
  39.             raise ValueError("Not valid number: " + v)

  40.     d1[ind]=bases

  41. print "ind1"," ".join(d1["ind1"])
  42. print "ind2"," ".join(d1["ind2"])
复制代码
  1. ind1 C C G G A A C C C C C C A A
  2. ind2 C C G G G G C C T T T T G G
复制代码
错别字太多了,看着费劲。

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
3 [报告]
发表于 2016-04-26 08:46 |只看该作者
我也是生物信息的,这个转换竟然看不懂呢

论坛徽章:
0
4 [报告]
发表于 2016-04-26 09:12 |只看该作者
回复 3# mswsg

应该是把alleles 的结果转换成类似plink的ped格式输入的数据转换。
   

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
5 [报告]
发表于 2016-04-26 10:37 |只看该作者
二楼对的就好回复 4# Hadron74


   

论坛徽章:
0
6 [报告]
发表于 2016-04-26 11:51 |只看该作者
回复 2# Hadron74

谢谢,确实输出格式给错了,已经修改过来了。谢谢您的帮忙,我仔细看了您的代码。解决问题了!

论坛徽章:
0
7 [报告]
发表于 2016-04-27 11:57 |只看该作者
回复 5# mswsg


   现在搞生物的写代码都这么牛了啊?
66666666666666666666666666

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
8 [报告]
发表于 2016-04-27 12:10 |只看该作者
逼着自己学的,除非是那种后来转生物的,本来学生物的,后来学coding的,都比较苦逼,相对来说python简单一点回复 7# beacon1024


   

论坛徽章:
0
9 [报告]
发表于 2016-04-29 06:48 |只看该作者
回复 8# mswsg


是的,自学很痛苦啊。大神,刚开始学,还有个问题请教下:http://bbs.chinaunix.net/thread-4244293-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP