10

中的值匹配功能R非常有用。但据我了解,它不足以支持二维或高维输入。

例如,假设xy是具有相同列数的矩阵,我想将 的行与x的行匹配y。'R' 函数调用match(x,y)不这样做。列表的输入也会出现同样的不足。

我已经实现了我自己的版本matchMat(xMat, yMat)(附在下面),但我想知道你对这个任务有什么解决方案。

matchMat = function(xMat, uMat, dimn=1) {
    ind = rep(-1, dim(xMat)[dimn])
    id = 1 : dim(uMat)[dimn]
    for (i in id) {
        e = utilSubMat(i, uMat, dimn)
        isMatch = matchVect(e, xMat, dimn)
        ind[isMatch] = i
    }
    return(ind)
}

matchVect = function(v, xMat, dimn) {
    apply(xMat, dimn, function(e) {
        tf = e == v
        all(tf)
    })
}

unittest_matchMat = function() {
    dimn = 1
    uMat = matrix(c(1, 2, 2, 3, 3, 4, 4, 5), ncol=2, byrow=T)
    ind = sample(dim(uMat)[1], 10, replace=T)
    print(ind)
    xMat = uMat[ind, ]
    rst = matchMat(xMat, uMat, dimn)
    print(rst)
    stopifnot(all(ind == rst))

    xMat2 = rbind(c(999, 999), xMat, c(888, 888))
    rst2 = matchMat(xMat2, uMat, dimn)
    print(rst2)
    stopifnot(all(c(-1, ind, -1) == rst2))
    print('pass!')   
}
4

5 回答 5

22

match将适用于lists 的原子向量。因此,要将一个矩阵的行与另一个矩阵匹配,您可以执行以下操作:

match(data.frame(t(x)), data.frame(t(y)))

t将行转置为列,然后在转置矩阵中data.frame创建一个列。list

于 2012-10-02T19:56:55.687 回答
5

row.match包中的函数prodlim允许您识别一个矩阵中的行,这些行也在另一个矩阵中找到(相同)。非常方便且易于使用。

library(prodlim)
row.match(x,y)
于 2016-06-30T03:58:33.593 回答
2

您可以在不使用任何功能的情况下做到这一点:

假设 adj1colnamesrow.names3*3矩阵,并且是您希望矩阵转换为的顺序:c('V1','V2','V3')vec1

vec1 <- c('V2','V3','V1')

您可以简单地使用以下代码:

adj1[vec1,vec1]

这会给你带来魔力。

干杯!

于 2015-05-14T12:47:19.803 回答
2

您可以使用asplit创建一个list可供匹配使用的。但是手册说列表被转换为字符向量,并且列表匹配可能非常慢,最好避免,除非在简单的情况下

match(asplit(x, 1), asplit(y, 1))
#[1] NA  1  2

所以也许使用interactionorpaste是一种选择。

match(interaction(data.frame(x)), interaction(data.frame(y)))
#[1] NA  1  2

match(apply(x, 1, paste, collapse =" "), apply(y, 1, paste, collapse =" "))
#[1] NA  1  2

数据:

(x <- matrix(1:9, 3))
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9

(y <- matrix(2:10, 3))
#     [,1] [,2] [,3]
#[1,]    2    5    8
#[2,]    3    6    9
#[3,]    4    7   10
于 2020-05-26T12:08:46.650 回答
0

你可以使用apply

z <- apply(x, 1, function(a) apply(y, 1, function(b) all(a==b)))

这将生成一个包含nrow(x)行和nrow(y)列的矩阵,其条目标记匹配的索引。

于 2016-05-21T23:23:38.933 回答