Как узнать, что находится в одном векторе, а что нет в другом?


86

В Matlab есть способ найти значения в одном векторе, но не в другом.

например:

x <- c(1,2,3,4)
y <- c(2,3,4)

есть ли какая-нибудь функция, которая сообщила бы мне, что значение, xкоторое не yвходит, равно 1?

Ответы:


122

вы можете использовать функцию setdiff () (установить разницу):

> setdiff(x, y)
[1] 1

37
Осторожно: setdiff(x,y)и setdiff(y,x)не одно и то же.
Сиань


28

Файл справки в R для setdiff, union, correct, setequal и is.element предоставляет информацию о стандартных функциях набора в R.

setdiff(x, y)возвращает элементы x, которых нет y.

Как отмечалось выше, это асимметричная разница. Так например:

> x <- c(1,2,3,4)
> y <- c(2,3,4,5)
> 
> setdiff(x, y)
[1] 1
> setdiff(y, x)
[1] 5
> union(setdiff(x, y), setdiff(y, x))
[1] 1 5


5

setdiff()- сложная функция, потому что вывод зависит от порядка ввода. Вместо этого вы можете написать простую функцию как таковую, которая будет делать полную противоположность intersect. Это намного лучше.

>difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}

#Now lets test it. 
>x <- c(1,2,3,4)
>y <- c(2,3,4,5)

>difference(x,y)
[1] 1 5

2

Если:

x <- c(1,2,3,4)
y <- c(2,3,4)

Любое из этих выражений:

setdiff(x, y)
x[!(x %in% y)]
x[is.na(match(x,y))]
x[!(is.element(x,y))]

даст вам правильный ответ [1] 1, если цель состоит в том, чтобы найти значения / символы x, которых нет в y.

Однако применение приведенных выше выражений может быть сложно и может дать нежелательные результаты в зависимости от природы вектора и положения x и y в выражении. Например, если:

x <- c(1,1,2,2,3,4)
y <- c(2,3,4)

и цель состоит в том, чтобы просто найти уникальные значения / символы x, которых нет, yили наоборот. Применение любого из этих выражений все равно даст правильный ответ [1] 1:

union(setdiff(x, y), setdiff(y, x))

Благодаря вкладу Джероми Англима

ИЛИ:

difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}
difference(y,x)

Благодаря вкладу работного дома

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.