2012-02-13 133 views
1

我有兩個包含從R導出的相關矩陣的.csv文件。一個文件包含P值,一個包含r值。行和列標題完全匹配這兩個文件。使用Python比較/從矩陣中提取數據(2.6.1)

我試圖提取r值和相應的行和列標題對只有當P值< 0.05。下面是樣品在什麼r值的輸入文件看起來像數據(I有1700+相關項,而不是僅示出兩個):

  Species1     Species2 
Species1  1      0.9 
Species2  0.9      1 

的P值的輸入文件是相同的,除了含有P值代替r值。

我對Python比較陌生,不確定如何處理這種類型的文件。我已經嘗試了一些策略,包括使用csv庫遍歷文件。我看着使用numpy,但它似乎並不適用於我(?)。我還研究過使用scipy來計算Python中的r值和P值(Pearsons),但似乎這隻適用於比較兩個一維數組(我有1700多列數據進行關聯)。

代碼我開始,向你展示我所輸入:

import csv 
infileP = open('AllcorrP.csv', 'rU') 
infileR = open('AllcorrR.csv', 'rU') 

問題 誰能幫我提取我的r值文件中的列和行標題和r值基於重要的(< 0.05)我的p值文件中的P值?

OR

之間的數據的許多列直接使用Python和僅提取與顯著P值的結果計算出所有可能的相關R-和P值?

最後,我想輸出兩個文件。
第一個文件:

Species1 Species2 Species4 ... 
Species2 Species1 Species7 ... 

等...(其中「Species1」是顯著相關性和上線的下一個項目的第一個物種,它顯著與(Species2,Species4等)相關的種

第二文件:

Species1 (corr) Species2 = 0.87 
Species2 (corr) Species7 = 0.72 
... 

等,其顯示每個成對相關和r值與它

去3210

在這一點上,我很高興能夠提取我想要的r值和物種列表,並在稍後確定最終的兩個文件格式。謝謝!

回答

1

要讀取數據,您應該可以使用numpy.genfromtext。查看文檔,這個函數中有很多功能。要了解你上面的例子,你可以這樣做:

from numpy import genfromtxt 
rdata = genfromtxt('AllcorrR.csv', skip_header=1)[:,1:] 
Pdata = genfromtxt('AllcorrP.csv', skip_header=1)[:,1:] 

的[:,1:]在閱讀時忽略數據的第一列中的函數沒有輸入到「忽略第一個x。列「就像它的行(通過skip_header)。不知道爲什麼他們沒有實現這一點,它總是給我留下了深刻的印象。

這隻會讀取P的數據(也可以爲r做這個)。然後你可以很容易地過濾數據。你可以在第一行和第一列分開閱讀標題。或者如果你看到genfromtxt文檔,你也可以命名它們(創建一個recarray)。

要查找的索引(值)其中,r是小於0.50,則可以簡單地做一個比較和numpy的自動的爲你創建一個布爾數組:

print Pdata < 0.05 

這可以被用來作爲一個指數到RDATA (請確保有相同數量的行/列):

print rdata[Pdata < 0.05] 
+0

謝謝! Numpy的確做得很好。我很抱歉不盡快給你寫信。 – python4ecology 2012-02-28 23:06:54

0

你可以做這樣的事情得到一個元組列表,包含行和列標題,以及數據的R和P值您感興趣的元素:

infile_r = open('AllcorrR.csv', 'r') 
infile_p = open('AllcorrP.csv', 'r') 

# Read the first line of each file. 
line_r = infile_r.readline() 
line_p = infile_p.readline() 

# Set the separator depending on the file format. 
SEPARATOR = None # Elements separated by whitespace. 
column_headers = line_r.split(SEPARATOR) 

significant = [] 

# Read the rest of the lines. 
for line_r in infile_r: 
    line_p = infile_p.readline() 
    tokens_r = line_r.split(SEPARATOR) 
    tokens_p = line_p.split(SEPARATOR) 
    row_header = tokens_r[0] 
    values_r = [float(v) for v in tokens_r[1:]] 
    values_p = [float(v) for v in tokens_p[1:]] 
    significant.extend([(row_header, column_header, r, p) for column_header, r, p in zip(column_headers, values_r, values_p) if p < 0.05]) 

print significant