Строка матрицы и ее обращение в той же матрице в R - PullRequest
0 голосов
/ 04 июня 2018

Есть ли способ узнать, содержится ли строка матрицы в матрице, но в обратном порядке?

Например, это происходит в следующей матрице W:

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
  [1,]    1    1    1    2    2    2    3    3    3
  [2,]    1    2    3    1    2    3    1    2    3
  [3,]    3    3    3    2    2    2    1    1    1

между первой и третьей строкой.

Я разработал следующий код, но он работает ТОЛЬКО, если строка существует в матрице в обратном порядке:

WW=W[, rev(seq_len(ncol(W)))]

x=match(data.frame(t(W)), data.frame(t(WW)))
A=cbind( c(1:nrow(W)),x )

Z=t(apply(A,1,sort)) 

x=unique(Z[,2])
W=W[-x,]

Итак, в предыдущей матрице W мой код не работает из-за NA в результате второй строки кода.

Как мы можем решить эту проблему?

1 Ответ

0 голосов
/ 04 июня 2018

"Есть ли способ узнать, содержится ли строка матрицы в матрице, но в обратном порядке?"

Да, вычислить расстояние между строками.Если ваша матрица не такая большая, это довольно эффективно:

m <- matrix(c(1, 1, 3, 1, 2, 3, 1, 3, 3, 2, 1, 2, 2, 2, 2, 2, 3, 2, 3, 1, 1, 3, 2, 1, 3, 3, 1), nrow = 3)
res <- as.matrix(dist(rbind(m, 
                            m[, rev(seq_len(ncol(m)))])))
res <- res[nrow(m) + seq_len(nrow(m)), seq_len(nrow(m))]
rownames(res) <- seq_len(nrow(m))

which(!res, arr.ind = TRUE)
#  row col
#3   3   1
#1   1   3

any(!res)
[1] TRUE
...