【问题标题】:How to compare single values of a vector with matrix and if they occur take values from another matrix with the same position?如何将向量的单个值与矩阵进行比较,如果它们发生从具有相同位置的另一个矩阵中获取值?
【发布时间】:2018-01-22 11:28:44
【问题描述】:

我是一个编程初学者,我无法解决这个问题:

我有一个长度为 132 的向量和两个大小为 132x24 的矩阵 A 和 B。我想获取向量的每一个值并将其与矩阵 A 逐行进行比较。如果该值出现在 A 中,我希望该列的索引转到矩阵 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

【问题讨论】:

  • 132 列,24 行?
  • 不,132x24 所以 132 行和 24 列
  • 需要明确地说,这两种方式都没有规则。即使有,最好还是清楚一点。既然你拒绝提供样本数据并期望我们弄清楚,我们不想把时间浪费在错误的方向上
  • 为什么不能分享样本数据和预期输出?
  • 嗯,这些信息在一小时前就很有用了……

标签: r for-loop matrix


【解决方案1】:
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() 是又快又脏。
要测试您的数据是否正常,您可以计算在A[i,] 行中找到值v[i] 的频率

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

如果你得到FALSE 然后检查:

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

【讨论】:

  • 谢谢!代码工作正常。不幸的是,它不适用于我的数据。我得到:无效的下标类型'列表'......正如我所说的我是初学者,很难理解
  • 检查sapply(ii, myfun) 最终sapply(sapply(ii, myfun), length) 的结果。最终,断言“这些值在每一行中只出现一次” 对您的数据来说是错误的。值v[i] 是否可能无法在A[i,] 行中找到?
  • 所以我检查了数据,确实有一个错误。现在一切正常。感谢您的帮助!
【解决方案2】:

好吧,我不知道你是如何描绘你的输出的,但我有一些接近的东西。

示例数据:

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 的值)。在这个矩阵的单元格中,如果x 的一个值和A 的一行的组合不成功,我们将找到NA,或者FIRSTA 内的列位置/strong> 匹配x 的值。

现在我们提取行位置并将它们与单元格值绑定在一起,除去匹配值的第二(列)维度。因此,我们为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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 2019-03-14
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多