【问题标题】:Row-wise calculation for each column value within a matrix矩阵中每一列值的逐行计算
【发布时间】:2018-11-01 21:37:50
【问题描述】:

我有一个 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

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

    *_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

【问题讨论】:

  • 欢迎来到 SO。 Stack Overflow 是一个面向专业和爱好者程序员的问答网站。目标是您将一些自己的代码添加到您的问题中,以至少显示您为解决这个问题所做的研究工作。
  • 请在您的问题中包含任何代码或数据,而不是从外部链接到它。
  • 您正在寻求转置一个矩阵。您可以使用awk 来做到这一点,但面向行的工具并不是最适合此操作,因为无论如何您都需要先阅读整个输入...您的问题已得到回答here

标签: r awk sed


【解决方案1】:

这是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

【讨论】:

  • 很好的建议..我会更多地研究 tidyverse 库..您能否详细说明如何添加第五列,其中包含“每个变量的正值除以特定变量的总数”。我可以将第 4 列中的阳性数计为“总和(df$'b1-b2'> 0)”,但它没有给我 x、y、z 特定计数
  • @AbhijitBarerjee 我不确定你的意思。我的代码重现了您的预期输出。我建议逐行运行代码以了解每一行的作用。我更新了我的答案以总结每个row 的正b1-b2 值的数量。也许这就是你所追求的。
  • 对不起,我可能不是很具体,代码工作正常,但我想添加一个额外的列。在该列中,对于 x,它将计算 1/2 =0.5 [因为 x 的正值数为 1(如在第四列中找到)并且 x 的总数为 2(如在第一列中找到)]。对于 y 和 z 也是如此,如果我有其他变量
  • @AbhijitBarerjee 只需将no_positive 除以n(),查看我的更新。
猜你喜欢
  • 2019-02-13
  • 2014-03-15
  • 2021-07-24
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多