В Matlab есть способ найти значения в одном векторе, но не в другом.
например:
x <- c(1,2,3,4)
y <- c(2,3,4)
есть ли какая-либо функция, которая скажет мне, что значение в x
, которое не в y
равно 1?
В Matlab есть способ найти значения в одном векторе, но не в другом.
например:
x <- c(1,2,3,4)
y <- c(2,3,4)
есть ли какая-либо функция, которая скажет мне, что значение в x
, которое не в y
равно 1?
вы можете использовать функцию setdiff() (set difference):
> setdiff(x, y)
[1] 1
Да. Для векторов вы можете просто использовать оператор %in%
или is.element()
.
> x[!(x %in% y)]
1
Для матрицы существует много разностных подходов. merge()
, вероятно, самый прямой. Я предлагаю посмотреть на этот вопрос для этого сценария.
Файл справки в 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
x[is.na(match(x,y))]
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
Если:
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