R:在矩阵中查找特定类型

R:在矩阵中查找特定类型,r,matrix,R,Matrix,假设你有这个矩阵: m1 = matrix(0, 5, 5, dimnames = list(c("A", "B", "C", "D", "E"), c(1, 2, 3, 4, 5))) m1[1,] = c(0,50,-10,0,10) m1[2,] = c(0,0,0,10,50) m1[3,] = c(0,0,10,100,4) m1[4,] = c(40,40,100,1,0) m1[5,] = c(1,0,100,0,60)) v1是阈值向量: v1 = matrix(0, 1, 5

假设你有这个矩阵:

m1 = matrix(0, 5, 5, dimnames = list(c("A", "B", "C", "D", "E"), c(1, 2, 3, 4, 5)))
m1[1,] = c(0,50,-10,0,10)
m1[2,] = c(0,0,0,10,50)
m1[3,] = c(0,0,10,100,4)
m1[4,] = c(40,40,100,1,0)
m1[5,] = c(1,0,100,0,60))
v1是阈值向量:

v1 = matrix(0, 1, 5, dimnames = list(c("thresholds", c(1, 2, 3, 4, 5)))
v1[1,] = c(10,20,10,50,90)
我想在R中这样做,并使用矢量化而不是循环。。。 首先是采用任何矩阵的函数:

#m is a matrix, #v is a vector of therholds
limitme <- function(x, v){
    y <- matrix(0, ncol(x), nrow(x)) #matrix of 0s same size as x
    for (i in 1:norow(x)){
        for (j in 1:nocol(x){
            if (x[i,j] >= v[j]) {
                y[i,j] = 100 #this could be whatever but I am choosing 0 and 100
                }
            elif (x[i,j] < v[j]) {
                y[i,j] = 0 #this could be whatever but I am choosing 0 and 100
                }
        }
    }
return(y)
}
#m是矩阵#v是矩阵的向量
极限
以及:

您可以使用逻辑矩阵从两个备选方案中进行选择。(可能更有趣,也就是说,很难在多个区间之间进行选择。可能需要将
apply
findInterval
一起使用)在这里,我在“A”和“B”之间进行选择,但可能是bweten数值:

matrix( c("A", "B")[ 1+sweep(m1, 2, v1['thresholds',], ">") ], nrow=nrow(m1) )
     [,1] [,2] [,3] [,4] [,5]
[1,] "A"  "B"  "A"  "A"  "A" 
[2,] "A"  "A"  "A"  "A"  "A" 
[3,] "A"  "A"  "A"  "B"  "A" 
[4,] "B"  "B"  "B"  "A"  "A" 
[5,] "A"  "A"  "B"  "A"  "A" 

也许你应该在发帖前看看你的代码是否运行。对不起,我不是最好的R-coder,我只是用了一个逻辑示例,让像你这样聪明的人理解我。
sweep(m1, 2, v1['thresholds',], ">")
      1     2     3     4     5
A FALSE  TRUE FALSE FALSE FALSE
B FALSE FALSE FALSE FALSE FALSE
C FALSE FALSE FALSE  TRUE FALSE
D  TRUE  TRUE  TRUE FALSE FALSE
E FALSE FALSE  TRUE FALSE FALSE
> sweep(m1, 2, v1['thresholds',], ">")*100
    1   2   3   4 5
A   0 100   0   0 0
B   0   0   0   0 0
C   0   0   0 100 0
D 100 100 100   0 0
E   0   0 100   0 0
matrix( c("A", "B")[ 1+sweep(m1, 2, v1['thresholds',], ">") ], nrow=nrow(m1) )
     [,1] [,2] [,3] [,4] [,5]
[1,] "A"  "B"  "A"  "A"  "A" 
[2,] "A"  "A"  "A"  "A"  "A" 
[3,] "A"  "A"  "A"  "B"  "A" 
[4,] "B"  "B"  "B"  "A"  "A" 
[5,] "A"  "A"  "B"  "A"  "A"