如何将矢量的单个值与矩阵进行比较,如果它们出现,则从另一个具有相同位置的矩阵中获取值?

时间:2018-01-22 11:28:44

标签: r for-loop matrix

我是一名编程初学者,但我无法解决此问题:

我的矢量长度为132,两个矩阵A和B的大小为132x24。我想获取向量的每个单独值并将其与矩阵A进行逐行比较。如果值出现在AI中,则希望将列的索引转到矩阵B并从具有相同位置的列中选择值(行和列索引)如矩阵A中所示。结果应作为具有相同长度132的向量返回。

怎么做?我是否需要for循环或是否有一些聪明的方法来处理包?

不幸的是我无法提供示例数据。

感谢您的帮助!

# vector v contains values that I want to compare with matrix A
> v
[1]  5  1 10  1  7

# every single value of v occurs in every row of A only once
# I want to have the position of this value in matrix A
> A
     [,1] [,2] [,3] [,4]
[1,]    5    7    4    1
[2,]   14    1    3    3
[3,]   13    3    1   10
[4,]    2    1    5    8
[5,]   13    2    5    7

# the position in matrix A equals the position in matrix B
# now the values of B have to be returned as a vector 
> B
     [,1] [,2] [,3] [,4]
[1,]    6    3    4    3
[2,]    5    2    5    5
[3,]    4    6    3    1
[4,]    3    6    1    5
[5,]    2    4    6    3

# vector with fitting values of B
> x
[1] 6 2 1 6 3

2 个答案:

答案 0 :(得分:2)

v <- c(5,  1, 10,  1,  7)
A <- matrix(c(
   5,    7,    4,    1,    
  14,    1,    3,    3,
  13,    3,    1,   10,    
   2,    1,    5,    8,   
  13,    2,    5,    7), 5, byrow = TRUE)
B <- matrix(c(
6,    3,    4,    3,
5,    2,    5,    5,
4,    6,    3,    1,
3,    6,    1,    5,
2,    4,    6,    3), 5, byrow = TRUE)

myfun <- function(i) which(v[i]==A[i,])  

ii <- 1:length(v)
B[cbind(ii, sapply(ii, myfun))]

功能myfun()快速“肮脏” 要测试您的数据是否正常,您可以计算在v[i]行中找到值A[i,]的频率

countv <- function(i) sum(v[i]==A[i,])
all(sapply(ii, countv)==1) ### should be TRUE

如果你得到FALSE,那么检查:

which(sapply(ii, countv)!=1)

答案 1 :(得分:1)

好吧,我不确定你是如何描绘你的输出的,但我已经接近了。

示例数据:

x <- 1:132
set.seed(123)
A <- matrix(sample(1:1000, size = 132*24, replace = TRUE), nrow = 132, ncol = 24)
B <- matrix(rnorm(132*24), nrow = 132, ncol = 24)

现在我们检查向量x的每个值,如果它出现在矩阵A的每一行中,那么它是:

x.vs.A <- sapply(x, function(x){
  apply(A, 1, function(y) {
    match(x, y)
  })
})

这为我们提供了一个矩阵x.vs.A,其中包含132行(A行)和132列(x的值)。在此矩阵的单元格内,如果NA的一个值与x的一行不成功,或A中的列位置,我们会找到A } x的值 FIRST 匹配。

现在我们提取行方向位置并将它们与单元格值绑定在一起,从而设置匹配值的第二个(列)维度。因此,我们为x的每个值创建矩阵A中匹配的行/列位置矩阵:

x.in.A <- apply(x.vs.A, 2, function(x) cbind(which(!is.na(x)), x[!is.na(x)]))

示例:

> x.in.A[[1]]
     [,1] [,2]
[1,]   12   17
[2,]   42   17
[3,]   73   12
[4,]  123   21

这会显示向量x中的第一个值可以在A[12, 17]A[42, 17]中找到,等等。

现在在B中访问这些值,为x的每个值返回向量,并将它们绑定到列表中的矩阵:

x.in.B <- lapply(x.in.A, function(x){
  apply(x, 1, function(y){
    B[y[1], y[2]]
  })
})

x.in.AB <- mapply(function(x, y) cbind(x, y),
                  x.in.A, x.in.B)

> x.in.AB[[1]]
                     y
[1,]  12 17 -0.2492526
[2,]  42 17 -0.7985330
[3,]  73 12  0.1253824
[4,] 123 21 -0.9704919