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?
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:
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 .
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
x[is.na(match(x,y))]
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
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
setdiff(x,y)ysetdiff(y,x)no son lo mismo.