¿Cómo saber qué hay en un vector y no en otro?

86

En matlab hay una forma de encontrar los valores en un vector pero no en el otro.

por ejemplo:

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

¿Hay alguna función que me diga que el valor xque no yestá en es 1?

Tony Stark
fuente

Respuestas:

122

puede utilizar la función setdiff () (establecer diferencia):

> setdiff(x, y)
[1] 1
Xela
fuente
37
Cuidado: setdiff(x,y)y setdiff(y,x)no son lo mismo.
Xi'an
59

Si. Para los vectores, simplemente puede usar el %in%operador o la is.element()función.

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

Para una matriz, hay muchos enfoques diferentes. merge()es probablemente el más sencillo. Sugiero mirar esta pregunta para ese escenario .

Shane
fuente
28

El archivo de ayuda en R para setdiff, union, intersect, setequal e is.element proporciona información sobre las funciones de conjunto estándar en R.

setdiff(x, y)devuelve los elementos xque no están en y.

Como se señaló anteriormente, es una diferencia asimétrica. Así por ejemplo:

> 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
Jeromy Anglim
fuente
12
x[is.na(match(x,y))]
George Dontas
fuente
5

setdiff()es una función complicada porque la salida depende del orden de la entrada. En su lugar, puede escribir una función simple como tal que haga exactamente lo contrario de intersect. Esto es mucho mejor.

>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
Caballo de batalla
fuente
2

Si:

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

Cualquiera de estas expresiones:

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

le dará la respuesta correcta [1] 1, si el objetivo es encontrar los valores / caracteres en x, que no está presente en y.

Sin embargo, aplicar las expresiones anteriores puede ser complicado y puede dar resultados no deseados según la naturaleza del vector y la posición de xey en la expresión. Por ejemplo, si:

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

y el objetivo es simplemente encontrar los valores / caracteres únicos en x, que no están presentes en yo viceversa. La aplicación de cualquiera de estas expresiones aún dará la respuesta correcta [1] 1:

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

Gracias a la contribución de Jeromy Anglim

O:

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

Gracias a la contribución de Workhouse

Guillermo
fuente