2014-02-21 37 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 
相关问题