2014-02-21 65 views
0

我有像以下矩陣:以矩陣劃分,其第一值的每個列值

totalreadcount 36 27 13 13 
bna-miR172e-3p 0 1 4805 2767 
bna-miR167a 4 26 11818 15776 
bna-miR172a 0 0 4302 2464 
bna-miR319b-3p 102 60 94 51 
bna-miR156a 0 0 139 59 
bna-miR167d 38 108 55389 58479 

我想通過其第一值。例如劃分列的每個值:在第二列36被第一個值,我需要用36除以0,4,102,0,38等餘數值,並與其他列相同。 矩陣大小很大,所以任何人都可以通過shell腳本或R語言腳本幫助我做這樣的計算。

回答

1

使用awk的,你可以這樣做:

awk 'NR==1 && NF>1 {$1=$1; for (i=2; i<=NF; i++) a[i]=$i} 
    NR>1{for (i=2; i<=NF; i++) $i=$i/a[i]} 1' file 

totalreadcount 36 27 13 13 
bna-miR172e-3p 0 0.037037 369.615 212.846 
bna-miR167a 0.111111 0.962963 909.077 1213.54 
bna-miR172a 0 0 330.923 189.538 
bna-miR319b-3p 2.83333 2.22222 7.23077 3.92308 
bna-miR156a 0 0 10.6923 4.53846 
bna-miR167d 1.05556 4 4260.69 4498.38 

說明:

在第一個塊,我有:

NR==1 && NF>1 {$1=$1; for (i=2; i<=NF; i++) a[i]=$i} 

其中只爲文件的第一條記錄運行,並將#2向前的每列存儲在數組中a$1=$1是簡單的技巧來改變記錄的多餘白色間距。

在第二塊我有:

NR>1{for (i=2; i<=NF; i++) $i=$i/a[i]} 

在這裏用於從#2開始,我們通過相應的存儲在數組a值除以列值的每一列。最後使用1打印stdout上的值。

+0

其工作原理請給我解釋其工作方法 – aksg24

+0

添加解釋來回答。 – anubhava

2

這裏有一個解決方案:

> mat <- matrix(1:15, 5, 3) 
> mat 
    [,1] [,2] [,3] 
[1,] 1 6 11 
[2,] 2 7 12 
[3,] 3 8 13 
[4,] 4 9 14 
[5,] 5 10 15 
> mat[-1, ]/mat[1, ] # divide all rows except the first one by the first row 
      [,1]  [,2]  [,3] 
[1,] 2.0000000 1.1666667 1.090909 
[2,] 0.5000000 0.7272727 13.000000 
[3,] 0.3636364 9.0000000 2.333333 
[4,] 5.0000000 1.6666667 1.363636 
相關問題