这次听起来可能很复杂,但我相信对于一些经验丰富的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
将位于此矩阵的不同列(位置)中。
答案 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])