|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
数据test.txt格式如下:
E00500:309:HTTVJCCXY:8:1104:3579:37541|TTTTACCT 99 chr1 10001 30 1S105M1I34M = 10106 143 CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCAACCCTAACCCTAACCCTAACCCCACCCCTAACCCCACCCCTAACCCTAACCCTA JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJJJFFJ7F<AFJF<A<FFFJFAJJAA<AJAFAA7A<FAA7F7F-7<J<J7--F<A-7<AA--77<<--A---7A--7-----777---A---7AJF--7 NM:i:5 MD:Z:84T24A9T1A17 AS:i:112 XS:i:111 RG:Z:L008
这是其中一行,需要用到的就第2列(99)、第3列(chr1)、第4列(10001)、第9列(143),现在要通过这几列来过滤test.txt,条件如下:
①第二列只能等于99或83
②在这一行中,chr=chr1,start=10001,end=start+143(第九列的值也有可能是负数,所以需要取绝对值),另外有一个位点数据,site.txt,格式如下:
chr1 13828906 13828907 rs7520386 0 +
chr1 88923260 88923261 rs7532151 0 +
chr2 107441475 107441476 rs776284 0 +
每一行是一个点,且彼此没有重叠的部分,在chr相同的情况下,我要统计每一行的点到底被多少test.txt中的范围所包含。最后的结果应该在site.txt的后面加一列,例如:
chr1 13828906 13828907 rs7520386 0 + 2
代表test.txt中的范围包含这一个点的有2行。
test.txt文本非常大,有几百万行,而site.txt就只有70几行,我自己想的办法如下:
- import pandas as pd
- f1 = open('test.txt','r')
- df = pd.read_table('site.txt',header=None)
- snp=[0] * 76
- flags = [99,83]
- # define a function to judge the aligned reads if belong to these target region
- def judge_range(line):
- chr = line.split("\t")[2]
- flag = line.split("\t")[1]
- start = line.split("\t")[3]
- insert = line.split("\t")[8]
- end = int(start) + int(abs(insert))
- f3 = open('site.txt','r')
- for i, region in enumerate(f3):
- S = region.split("\t")[1]
- CHR = region.split("\t")[0]
- if chr == CHR and S in range(start,end):
- snp[i] = snp[i] + 1
- else:
- continue
- # define main function
- for line in f1:
- flag = line.split("\t")[1]
- if flag in flags:
- judge_range(line)
- else:
- continue
- data = pd.DataFrame(snp)
- data.rename(columns={0:'align_number'},inplace=True)
- df1 = pd.concat([df,data],axis=1,ignore_index=True)
- df1.to_csv(sys.argv[3],header=False)
复制代码
不知道为什么,这个代码异常的缓慢,根本运行不出来,请问一下有没有其它什么有效的方法?
|
|