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

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

например:

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

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

Ответ 1

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

> setdiff(x, y)
[1] 1

Ответ 2

Да. Для векторов вы можете просто использовать оператор %in% или is.element().

> x[!(x %in% y)]
1

Для матрицы существует много разностных подходов. merge(), вероятно, самый прямой. Я предлагаю посмотреть на этот вопрос для этого сценария.

Ответ 3

Файл справки в R для setdiff, union, intersect, 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

Ответ 4

x[is.na(match(x,y))]

Ответ 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

Ответ 6

Если:

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)

Благодаря вкладу Workhouse