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 x
que no y
está 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 x
que no y
está 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 x
que 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 y
o 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.