如何在R中不使用apply或循环,按向量元素及位置提取矩阵值?
R语言一步提取矩阵对应位置元素的方法
我有如下定义的R语言矩阵prob.matx:
prob.matx <- structure(c(0.182, 0.212, 0.364, 0.242, 0.242, 0.152, 0.394, 0.212, 0.364, 0.091, 0.273, 0.273, 0.333, 0.242, 0.364, 0.061, 0.273, 0.333, 0.212, 0.182, 0.303, 0.333, 0.182, 0.182), dim = c(4L, 6L), dimnames = list(c("A", "C", "G", "T"), c("V1", "V2", "V3", "V4", "V5", "V6")))
矩阵展示形式:
V1 V2 V3 V4 V5 V6 A 0.182 0.242 0.364 0.333 0.273 0.303 C 0.212 0.152 0.091 0.242 0.333 0.333 G 0.364 0.394 0.273 0.364 0.212 0.182 T 0.242 0.212 0.273 0.061 0.182 0.182
同时有一个DNA向量:
DNA <- c("A", "C", "C", "C", "C", "A")
需要提取prob.matx中对应位置的元素:即prob.matx[DNA[1],1]、prob.matx[DNA[2],2]……prob.matx[DNA[6],6],预期结果为:
[1] 0.182 0.152 0.091 0.242 0.333 0.303
要求无需使用apply或循环,一步实现。
解决方案
直接利用R语言矩阵的索引特性,通过cbind构造行列索引对,一步提取目标元素:
prob.matx[cbind(DNA, seq_along(DNA))]
运行后直接得到预期结果:
[1] 0.182 0.152 0.091 0.242 0.333 0.303
原理说明
cbind(DNA, seq_along(DNA))会生成一个2列的索引矩阵,每一行对应一个待提取元素的行、列位置。R语言的矩阵支持这种矩阵形式的索引输入,会直接返回所有对应位置的元素组成的向量,完全不需要循环或apply系列函数。
内容的提问来源于stack exchange,提问作者benson23
相关产品推荐
相关产品推荐

