【问题标题】:How can I create a matrix with a specific math equation?如何创建具有特定数学方程的矩阵?
【发布时间】:2017-03-10 02:17:12
【问题描述】:

我有庞大的数据集。数据由 371 个基因型(以 gwas 开始)和 105000 个标记组成。我需要使用 105000 个标记在 R 中的基因型中使用特定的数学方程建立一个矩阵。数据格式如下

markers  gwas_100   gwas_101    gwas_102    gwas_103
S1_147748   NA  NA  NA  NA
S1_239131   0.67385 0.67385 0.67385 0.67385
S1_644966   0.61051 0.61051 0.61051 0.61051
S1_1625764  NA  0.71429 NA  0.71429
S1_1761929  0.69137 0.69137 0.69137 0.69137
S1_1778021  0.72372 0.72372 0.72372 0.72372
S1_1778059  0.72507 0.72507 0.72507 0.72507
S1_1778136  0.68733 0.68733 0.68733 0.68733
S1_1778289  0.69946 0.69946 0.69946 0.69946
S1_1780669  0.73046 0.73046 0.73046 0.73046
S1_1786636  0.71563 0.71563 0.71563 0.71563
S1_1786639  0.71833 0.71833 0.71833 0.71833
S1_1786640  0.71294 0.71294 0.71294 0.71294
S1_1786678  0.71429 0.71429 0.71429 0.71429
S1_1963487  0.72776 0.72776 0.72776 0.72776
S1_2036329  0.74259 0.74259 0.74259 0.74259
S1_2036386  0.74394 0.74394 0.74394 0.74394
S1_2037735  0.7628  0.7628  0.7628  0.7628
S1_2037760  0.7628  0.7628  0.7628  0.7628
S1_2037773  0.7628  0.7628  0.7628  0.7628
S1_2042132  0.58491 NA  NA  NA

数学方程

(gwas_100 & gwas_101) = Sum (gwas100) - sum (gwas_101), where
sum gwas_100 = 0.67385 + 0.61051 + 0.69137.....+0.58491)
sum gwas_101 = 0.67385 + 0.61051+ ....... 0.7228), therefore
(gwas_100 & gwas_101) = 13.4905 - 13.61994 = -0.12938

然后我需要得到每两个之间的矩阵以及 371 种基因型的所有可能组合 举个例子

      gwas_100 gwas101 gwas_102 gwas_103
gwas_100          -0.12   0.14      0.05
gwas_101                   0.06     0.1 
gwwas_102                           0.07
gwas_103

提前致谢

【问题讨论】:

    标签: r math matrix sparse-matrix matrix-multiplication


    【解决方案1】:

    您可以先使用colSums 对忽略NAs 的列求和,然后使用outer 对它们进行减法:

    sums <- colSums(data[-1], na.rm=TRUE)
    outer(sums,sums,`-`)
             gwas_100 gwas_101 gwas_102 gwas_103
    gwas_100  0.00000 -0.12938  0.58491 -0.12938
    gwas_101  0.12938  0.00000  0.71429  0.00000
    gwas_102 -0.58491 -0.71429  0.00000 -0.71429
    gwas_103  0.12938  0.00000  0.71429  0.00000
    

    【讨论】:

    • 谢谢你的回答。我也想使用一个复杂的方程。例如
    • 谢谢你的回答。我也想使用一个复杂的方程。例如 gwas_100& gwas_101 = 总和 (p1 - p2)^2/105854。其中 P1 和 p2 是 gwas_100 和 gwas_101 中一个标记的数字。换句话说,我需要从第 2 列中减去第 1 列中的值,然后将差值相加,然后 ^2。提前致谢。非常感谢您的时间和努力
    • @AhmedSallam 这是一个很不一样的问题,所以你必须把整个计算放到外层,这样会降低性能。你可以试试:outer(names(data[,-1]),names(data[,-1]),function(x,y){colSums((data[,x]-data[,y])**2, na.rm=TRUE)})
    猜你喜欢
    • 2020-02-24
    • 2022-06-14
    • 1970-01-01
    • 2021-03-31
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多