Проверьте, что вектор содержится в матрице в R - PullRequest
2 голосов
/ 28 ноября 2010

Я не могу поверить, что это займет у меня так много времени, чтобы выяснить, и я все еще не могу понять это.

Мне нужно сохранить коллекцию векторов, а потом проверить, что определенный векторнаходится в этой коллекции.Я пробовал списки в сочетании с %in%, но это не работает должным образом.

Моей следующей идеей было создание матрицы и rbind векторов к ней, но сейчас я не знаю, как проверить, содержится ли вектор в матрице.%in появляется для сравнения наборов, а не точных строк.То же самое относится и к пересечению.

Помощь очень ценится!

Ответы [ 2 ]

8 голосов
/ 28 ноября 2010

Вы имеете в виду, как это:

wantVec <- c(3,1,2)
myList <- list(A = c(1:3), B = c(3,1,2), C = c(2,3,1))
sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or, is the vector in the set?
any(sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec))

Мы можем сделать аналогичное с матрицей:

myMat <- matrix(unlist(myList), ncol = 3, byrow = TRUE)
## As the vectors are now in the rows, we use apply over the rows
apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or
any(apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec))

Или по столбцам:

myMat2 <- matrix(unlist(myList), ncol = 3)
## As the vectors are now in the cols, we use apply over the cols
apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or
any(apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec))

Если вам нужно много делать, напишите свою собственную функцию

vecMatch <- function(x, want) {
    isTRUE(all.equal(x, want))
}

А затем используйте его, например, в списке myList:

> sapply(myList, vecMatch, wantVec)
    A     B     C 
FALSE  TRUE FALSE 
> any(sapply(myList, vecMatch, wantVec))
[1] TRUE

Или даже обернуть все это:

vecMatch <- function(x, want) {
    out <- sapply(x, function(x, want) isTRUE(all.equal(x, want)), want)
    any(out)
}

> vecMatch(myList, wantVec)
[1] TRUE
> vecMatch(myList, 5:3)
[1] FALSE

РЕДАКТИРОВАТЬ: Быстрый комментарий о том, почему я использовал isTRUE(), обернутый вокруг all.equal() вызовов. Это связано с тем, что если два аргумента не равны, all.equal() не возвращает логическое значение (FALSE):

> all.equal(1:3, c(3,2,1))
[1] "Mean relative difference: 1"

isTRUE() здесь полезен, потому что возвращает TRUE, если его аргумент равен TRUE, а возвращает FALSE, если это что-то еще.

0 голосов
/ 23 ноября 2015
> M
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9


 v <- c(2, 5, 8)

проверьте каждый столбец:

 c1 <- which(M[, 1] == v[1])
 c2 <- which(M[, 2] == v[2])
 c3 <- which(M[, 3] == v[3])

Вот способ по-прежнему использовать intersect () для более чем 2 элементов

> intersect(intersect(c1, c2), c3)

[1] 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...