Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在矩阵中查找一个模式,并基于该模式除以列名中的值_R - Fatal编程技术网

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这只是因为我在过去遇到过类似的问题。