我是编程初学者,我无法解决这个问题:
我有一个向量长度 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