R 在矩阵中查找一个模式,并基于该模式除以列名中的值
这一次可能听起来很复杂,但我相信对于一些有经验的俄罗斯人来说,这很容易做到。我有这样一个矩阵:R 在矩阵中查找一个模式,并基于该模式除以列名中的值,r,R,这一次可能听起来很复杂,但我相信对于一些有经验的俄罗斯人来说,这很容易做到。我有这样一个矩阵: > 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,
> 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
所以首先。在第一行中,我们在名为234.35
的列中有一个编号1
。我们从colnames
中获取这个数字,并将其除以同一行最后一列中的数字。根据第一行:
234.35/24.5=9.56
,该数字将进入下一列同一行(必须创建,名称可以是“Fold”
)
代码应穿过所有行,但数字
1
将位于该矩阵中的不同列(位置)。我们可以在数据集子集上使用max.col
,不包括最后一列“MW”。假设每行只有一个“1”,则无需指定“ties.method”。在这里,我给出的选项是“第一”。由此派生的索引可用于获取列名,将其转换为“数值”,将其除以最后一列,并使用原始数据集对其进行cbind
yoe1 <- cbind(yoe, newcol=as.numeric(colnames(yoe[,1:20])[max.col(yoe[,1:20],
'first')])/yoe[,21])
yoe1我希望至少有几行代码。。。太多了!对你们中的一些人来说,这太容易了。@Rechlay这只是因为我在过去遇到过类似的问题。