矩阵中每个列值的逐行计算

时间:2018-11-01 21:37:50

标签: r awk sed

我有一个csv格式的输入矩阵文件,例如:

         x     y      z
a1_b1   0.6   0.44   0.6
a1_b2   0.9   0.1    0.04
a2_b1   0.7   0.02   0.7
a2_b2   0.5    0.4   0.11

由此,我想对b#值与a的不同组合进行逐行计算。上述矩阵的模型输出如下:

    *_b1    *_b2   *_b2-*_b1     Calculate_Positives (for each variable)
x   0.6      0.9     -0.3       =# of positive values for x (in 4th column)/# of x 
x   0.7      0.5      0.2
y   0.44     0.1      0.34      =# of positive values for y/# of y
y   0.02     0.4     -0.38
z   0.6      0.04     0.56      =# of positive values for z/# of z
z   0.7      0.11     0.59 

如果有人建议上述任何awk / sed / r代码,我将不胜感激。

请在下面查看模型(csv格式)的输入和输出文件。

Input

Output

1 个答案:

答案 0 :(得分:0)

这是一个tidyverse解决方案

library(tidyverse)

df %>%
    rownames_to_column("id") %>%
    gather(row, value, -id) %>%
    separate(id, into = c("tmp", "col")) %>%
    spread(col, value) %>%
    select(-tmp) %>%
    arrange(row) %>%
    mutate(`b1-b2` = b1 - b2)
#  row   b1   b2 b1-b2
#1   x 0.60 0.90 -0.30
#2   x 0.70 0.50  0.20
#3   y 0.44 0.10  0.34
#4   y 0.02 0.40 -0.38
#5   z 0.60 0.04  0.56
#6   z 0.70 0.11  0.59

更新

df %>%
    rownames_to_column("id") %>%
    gather(row, value, -id) %>%
    separate(id, into = c("tmp", "col")) %>%
    spread(col, value) %>%
    select(-tmp) %>%
    arrange(row) %>%
    mutate(`b1-b2` = b1 - b2) %>%
    group_by(row) %>%
    summarise(no_positives = sum(`b1-b2` > 0) / n())
## A tibble: 3 x 2
#  row   no_positives
#  <chr>        <dbl>
#1 x              0.5
#2 y              0.5
#3 z              1