2016-09-19 101 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') 
相關問題