在矩阵中查找模式,并基于除以列名中的值

时间:2015-03-27 16:13:50

标签: r

这次听起来可能很复杂,但我相信对于一些经验丰富的Rusers来说,它很容易做到。我有一个像这样的矩阵:

> dput(head(yoe))
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.5, 
24.5, 32.6, 32.6, 32.6, 32.6), .Dim = c(6L, 21L), .Dimnames = list(
    c("AT1G01050_0", "AT1G01050_1", "AT1G01080_0", "AT1G01080_1", 
    "AT1G01080_2", "AT1G01080_3"), c("10", "33.95", "58.66", 
    "84.42", "110.21", "134.16", "164.69", "199.1", "234.35", 
    "257.19", "361.84", "432.74", "506.34", "581.46", "651.71", 
    "732.59", "817.56", "896.24", "971.77", "1038.91", "MW")))

我将使用该表更好地解释我想要实现的目标:

            10 33.95 58.66 84.42 110.21 134.16 164.69 199.1 234.35 257.19 361.84 432.74 506.34 581.46 651.71 732.59 817.56 896.24
AT1G01050_0  0     0     0     0      0      0      0     0      1      0      0      0      0      0      0      0      0      0
AT1G01050_1  0     0     0     0      0      0      0     0      0      0      0      0      0      1      0      0      0      0
AT1G01080_0  0     0     0     1      0      0      0     0      0      0      0      0      0      0      0      0      0      0
AT1G01080_1  0     0     0     0      0      0      1     0      0      0      0      0      0      0      0      0      0      0
AT1G01080_2  0     0     0     0      0      0      0     0      0      0      1      0      0      0      0      0      0      0
AT1G01080_3  0     0     0     0      0      0      0     0      0      0      0      0      0      1      0      0      0      0
            971.77 1038.91   MW
AT1G01050_0      0       0 24.5
AT1G01050_1      0       0 24.5
AT1G01080_0      0       0 32.6
AT1G01080_1      0       0 32.6
AT1G01080_2      0       0 32.6
AT1G01080_3      0       0 32.6

首先。在第一行中,我们在名为1的列中有一个数字234.35。我们从colnames中取这个数字,然后除以同一行最后一列中的数字。根据第一行:

234.35 / 24.5 = 9.56此号码将转到下一列相同的行(必须创建,名称可以是"Fold")。

代码应遍历所有行,但数字1将位于此矩阵的不同列(位置)中。

1 个答案:

答案 0 :(得分:2)

我们可以在除最后一列" MW"之外的数据集子集上使用max.col。假设只有一个" 1"每行,没有必要指定" ties.method"。在这里,我给出了选项" first"。从中派生的索引可用于获取列名称,将其转换为'数字',将其除以最后一列,并将cbind与原始数据集分开。

yoe1 <- cbind(yoe, newcol=as.numeric(colnames(yoe[,1:20])[max.col(yoe[,1:20], 
                     'first')])/yoe[,21])