我是一名编程初学者,但我无法解决此问题:
我的矢量长度为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
答案 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