다른 벡터가 아닌 한 벡터에 무엇이 있는지 어떻게 알 수 있습니까?


88

matlab에는 한 벡터에서 값을 찾는 방법이 있지만 다른 벡터에서는 그렇지 않습니다.

예를 들면 :

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

안에 x없는 값 y이 1 이라는 것을 알려주는 함수가 있습니까?

답변:


123

setdiff () (차이 설정) 함수를 사용할 수 있습니다.

> setdiff(x, y)
[1] 1

37
조심 : setdiff(x,y)그리고 setdiff(y,x)동일하지 않습니다.
Xi'an


28

setdiff, union, intersect, setequal 및 is.element에 대한 R의 도움말 파일은 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의 값 / 문자를 찾는 것이 목표 인 경우 정답을 제공합니다 .xy

그러나 위의 표현식을 적용하는 것은 까다로울 수 있으며 벡터의 특성과 표현식에서 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))

Jeromy Anglim의 기여 덕분에

또는:

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

Workhouse의 기여 덕분에

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.