2013-08-21 27 views
2

我有結構化的這樣的數據文件:變換數據幀劃分成矩陣與計數

OTU1 PIA0 1120 
OTU2 PIA1 2 
OTU2 PIA3 6 
OTU2 PIA4 10 
OTU2 PIA5 1078 
OTU2 PIN1 24 
OTU2 PIN2 45 
OTU2 PIN3 261 
OTU2 PIN4 102 
OTU3 PIA0 16 
OTU3 PIA1 59 
OTU3 PIA2 27 
OTU3 PIA3 180 
OTU3 PIA4 200 
OTU3 PIA5 251 
OTU3 PIN0 36 
OTU3 PIN1 61 
OTU3 PIN2 156 
OTU3 PIN3 590 
OTU3 PIN4 277 
OTU4 PIA0 401 
OTU4 PIN0 2 

我想要創建一個矩陣,示出了從第二塔以第一列作爲用於計數基準數據的組合(顯示每次測量第一列數量-OTU1,OTU2,OTU3,OTU4多少次 - 來自第二列的每個數據在相同的OTU中彼此一起出現)。它需要像這樣:一排並用相同名稱的列之間

PIA0 PIA1 PIA2 PIA3 PIA4 PIA5 PIN0 PIN1 PIN2 PIN3 PIN4 
PIA0 1  1  1  1  1  1  2  1  1  1  1 
PIA1 1  0  1  2  2  2  1  2  2  2  2 
PIA2 1  1  0  1  1  1  1  1  1  1  1 
PIA3 1  2  1  0  2  2  1  2  2  2  2 
PIA4 1  2  1  2  0  2  1  2  2  2  2 
PIA5 1  2  1  2  2  0  1  2  2  2  2 
PIN0 2  1  1  1  1  1  0  1  1  1  1 
PIN1 1  2  1  2  2  2  1  0  2  2  2 
PIN2 1  2  1  2  2  2  1  2  0  2  2 
PIN3 1  2  1  2  2  2  1  2  2  0  2 
PIN4 1  2  1  2  2  2  1  2  2  2  0 

數據共享反映了這一數據單獨出現在OTU的次數。

任何想法?

我已經閱讀了關於R庫'reshape2'和命令'acast'here,但是我只能改變其中包含所有數據的矩陣的形狀,不能根據需要進行組合計數。我也一直在考慮一個Biopython腳本,但我認爲用我對編程的一點基礎知識寫下來會太大也很難。

目標是構建一個像這個例子中的矩陣,所以我可以使用這些數據運行CIRCOS online程序。

+0

我試圖按照你的解釋,不能看到你的數據之間的鏈接 - 你能發表一個簡單的例子嗎? – alexwhan

+0

我想要做的是編寫一個數字,以反映第二列中的每個數據在單個「OTU」中出現的次數。我的意思是,例如,在'OTU'(第一列,OTU1,OTU3和OTU4)中出現'PIA0',而'PIN0'僅出現在2(OTU3和OTU4)中。由於'PIA0'和'PIN0'都出現在OTU3和OTU4中,所以決賽桌中他們交叉點的數字必須是2. –

回答

4

您可以使用dcast創建一個二進制矩陣,指示每個OTU內部每個PI的存在,然後將其相乘以獲得計數。

d <- read.fwf(textConnection(" 
OTU1 PIA0 1120 
OTU2 PIA1 2 
OTU2 PIA3 6 
OTU2 PIA4 10 
OTU2 PIA5 1078 
OTU2 PIN1 24 
OTU2 PIN2 45 
OTU2 PIN3 261 
OTU2 PIN4 102 
OTU3 PIA0 16 
OTU3 PIA1 59 
OTU3 PIA2 27 
OTU3 PIA3 180 
OTU3 PIA4 200 
OTU3 PIA5 251 
OTU3 PIN0 36 
OTU3 PIN1 61 
OTU3 PIN2 156 
OTU3 PIN3 590 
OTU3 PIN4 277 
OTU4 PIA0 401 
OTU4 PIN0 2"), widths=c(8,8,10), header=FALSE, skip=1) 

library(reshape2) 
A <- as.matrix(dcast(V1 ~ V2, data=d, length)[,-1]>0) 
#   PIA0  PIA1  PIA2  PIA3  PIA4  PIA5  PIN0  PIN1  PIN2  PIN3  PIN4  
# [1,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
# [2,] FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE 
# [3,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE 
# [4,]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE 
t(A) %*% A 
#    PIA0  PIA1  PIA2  PIA3  PIA4  PIA5  PIN0  PIN1  PIN2  PIN3  PIN4  
# PIA0   3  1  1  1  1  1  2  1  1  1  1 
# PIA1   1  2  1  2  2  2  1  2  2  2  2 
# PIA2   1  1  1  1  1  1  1  1  1  1  1 
# PIA3   1  2  1  2  2  2  1  2  2  2  2 
# PIA4   1  2  1  2  2  2  1  2  2  2  2 
# PIA5   1  2  1  2  2  2  1  2  2  2  2 
# PIN0   2  1  1  1  1  1  2  1  1  1  1 
# PIN1   1  2  1  2  2  2  1  2  2  2  2 
# PIN2   1  2  1  2  2  2  1  2  2  2  2 
# PIN3   1  2  1  2  2  2  1  2  2  2  2 
# PIN4   1  2  1  2  2  2  1  2  2  2  2 
+0

非常感謝,我認爲這正是我們所期待的。但是,正如我之前所說的,我在'R'上很新,所以我有很多問題:'widths = c(8,8,10)'是指什麼?和'[,-1]> 0'?再次感謝。 –

+0

'width = c(8,8,10)'只是'read.fwf'的一個參數,我用它創建data.frame:因爲你已經有了你的data.frame,你不需要這個。 '[,-1]'刪除第一列(它包含MTU)。 '> 0'將計數(長度結果)轉換爲布爾值。您可以將'dcast(V1〜V2,data = d)'與'dcast(V1〜V2,data = d)[, - 1])'或'dcast(V1〜V2,data = d,length)'進行比較。 –

+0

非常感謝,它工作得很好。還有一個問題:有什麼方法可以獲得結果中每列(PIA0,PIA1,PIA2 ...)有一個參數='TRUE',而所有其他列有'FALSE'值(數字每一列在原始數據幀中表現爲OTU的唯一組成部分)?再次感謝 –