¿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?

Respuestas:


122

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

> setdiff(x, y)
[1] 1

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 .


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


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.