R:在2个矩阵中映射匹配元素的唯一列

时间:2018-01-04 22:18:24

标签: r

我正在尝试在2个矩阵之间映射匹配列。为简单起见,我有2个简单的矩阵,a和b:

L = []
for a in A
    push!(L, length(a))
end
A[findmax(L)[2]]

我想创建一个长度为(a [,1])= 2的矢量,即

a <- matrix(c(1, 2), nrow = 2, ncol = 2)
b <- matrix(c(1,2,1,2,3:8), nrow = 2, ncol = 5)

> a
     [,1] [,2]
[1,]    1    1
[2,]    2    2

> b
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    3    5    7
[2,]    2    2    4    6    8

out的第一个元素是b中与a的第一列匹配的列号,out的第二个元素是b中与第二列匹配的列号。我试过了

> out
[1] 1 2 

但我需要结果向量的每个元素都是唯一的。可能是简单的解决方案,但我没有看到它。谢谢!

2 个答案:

答案 0 :(得分:1)

您可能正在寻找类似intersect的内容。

a <- matrix(c(10, 20), nrow = 2, ncol = 2)
b <- matrix(c(10,20,1,2,3:6,10,20), nrow = 2, ncol = 5)

#> b
#     [,1] [,2] [,3] [,4] [,5]
#[1,]   10    1    3    5   10
#[2,]   20    2    4    6   20

#Finding matching columns in b from a. Only 1st column of a is considered
matched <- b[,1:ncol(b)] == a[,1:1]

#> matched
#     [,1]  [,2]  [,3]  [,4] [,5]
#[1,] TRUE FALSE FALSE FALSE TRUE
#[2,] TRUE FALSE FALSE FALSE TRUE

desired <- which(matched[1,], arr.ind = TRUE)
#> desired 
#[1] 1 5   

返回匹配的第1列和第5列。

答案 1 :(得分:1)

我想我不能在这里发表评论。 Anyhoo ...... MKR的上述答案看起来不错,但我会在创建“所需”对象之前添加此行。这是为了确保每个列元素匹配(而不是仅测试第一行)。

matched<-sapply(1:ncol(matched),function(x) all(matched[,x]))