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



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

我有一个向量长度 132 和两个矩阵 A 和 B,大小为 132x24。我想获取向量的每一个值,并将其与矩阵 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
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)

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

示例数据:

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,或者x值的第一个匹配项A内的列位置。

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

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

最新更新