2016-09-19 106 views
1

我有一个问题派生关系构建的边缘名单,我有几百万行的文件安排像这样:从两个柱状文件的第二列从第一列

1 Protein_A 
1 Protein_B 
2 Protein_A 
3 Protein_C 
4 Protein_A 
4 Protein_B 
4 Protein_C 
4 Protein_D 
5 Protein_C 
5 Protein_D 

凡列1表示相互作用途径,第2栏表示蛋白质的ID。任何人都可以推荐我可以排序成只(非互惠)每个网络如相互作用的边缘列表这样的一个有效的方法:

1 Protein_A,Protein_B 
4 Protein_A,Protein_B 
4 Protein_A,Protein_C 
4 Protein_A,Protein_D 
4 Protein_B,Protein_C 
5 Protein_C,Protein_D 
5 Protein_C,Protein_D 

或者给我到哪里找这样的数据的指示?

我尝试了外壳脚本,它通过文件慢慢迭代并删除新线在导致以下的文件的末尾:然而

1 Protein_A 1 Protein_B 

这可以被加工成一个边,这如果网络中有超过2种蛋白质,则不起作用。我正在画空白。任何人都可以帮忙吗?

预先感谢您。

回答

1

相当容易使用python和一些智能模块。我已将文件内容嵌入到字符串中。只需替换data = open("input.txt")即可从文件中读取(也可以迭代)。

我创建了一个字典,其中的数字作为关键字和匹配数字的蛋白质列表作为值。

一旦建成,我使用大小为2的itertools.combinations来生成列表,一路打印密钥。

import re 
import collections,itertools 

data="""1 Protein_A 
1 Protein_B 
2 Protein_A 
3 Protein_C 
4 Protein_A 
4 Protein_B 
4 Protein_C 
4 Protein_D 
5 Protein_C 
5 Protein_D""".split("\n") 

d = collections.defaultdict(lambda : list()) 

for l in data: 
    fields = re.split("\s+",l.strip()) 
    d[int(fields[0])].append(fields[1]) 

for k,v in d.items(): 
    for a,b in itertools.combinations(v,2): 
     print(k,a,b) 

结果:

(1, 'Protein_A', 'Protein_B') 
(4, 'Protein_A', 'Protein_B') 
(4, 'Protein_A', 'Protein_C') 
(4, 'Protein_A', 'Protein_D') 
(4, 'Protein_B', 'Protein_C') 
(4, 'Protein_B', 'Protein_D') 
(4, 'Protein_C', 'Protein_D') 
(5, 'Protein_C', 'Protein_D') 
相关问题