10

値マッチング関数R非常に便利です。しかし、私の理解では、2次元または高次元の入力を十分にサポートしていません。

たとえば、とが同じ列数の行列であると仮定xし、の行をの行yに一致させたいとします。'R'関数呼び出しはそうしません。リストの入力にも同じ不十分さが発生します。 xymatch(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

matchlistsの原子ベクトルで動作します。したがって、ある行列の行を別の行列に一致させるには、次のようにすることができます。

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

関数を使用せずにそれを行うことができます:

colnames とrow.namesの両方が存在する行列でありadj1、行列を次のように変換する順序であるとします。3*3c('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

したがって、interactionまたはを使用するpasteことはオプションです。

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 に答える