У 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?
Відповіді:
Так. Для векторів ви можете просто використовувати %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
setdiff(x,y)
іsetdiff(y,x)
не те саме.