【问题标题】:divide each column value with its first value in a matrix将每列值与其在矩阵中的第一个值相除
【发布时间】:2014-02-21 07:19:20
【问题描述】:

我有一个如下矩阵:

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 列是第一个值,我需要将 0、4、102、0、38 等其余值除以 36,并且与其他列相同. 矩阵大小很大,所以任何人都可以通过shell脚本或R语言脚本来帮助我进行这样的计算。

【问题讨论】:

    标签: r shell


    【解决方案1】:

    这里有一个解决方案:

    > 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
    

    【讨论】:

      【解决方案2】:

      使用 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 用于在标准输出上打印值。

      【讨论】:

      • 它的工作原理,请解释一下它的工作方法
      • 添加解释以回答。
      猜你喜欢
      • 2020-08-11
      • 2014-04-06
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多