No matlab, existe uma maneira de encontrar os valores em um vetor, mas não no outro.
por exemplo:
x <- c(1,2,3,4)
y <- c(2,3,4)
existe alguma função que me diga que o valor em x
que não y
está em é 1?
No matlab, existe uma maneira de encontrar os valores em um vetor, mas não no outro.
por exemplo:
x <- c(1,2,3,4)
y <- c(2,3,4)
existe alguma função que me diga que o valor em x
que não y
está em é 1?
Respostas:
Sim. Para vetores, você pode simplesmente usar o %in%
operador ou is.element()
função.
> x[!(x %in% y)]
1
Para uma matriz, existem muitas abordagens diferentes. merge()
é provavelmente o mais direto. Eu sugiro olhar para esta questão para esse cenário .
O arquivo de ajuda em R para setdiff, union, intersect, setequal e is.element fornece informações sobre as funções de conjunto padrão em R.
setdiff(x, y)
retorna os elementos de x
que não estão em y
.
Como observado acima, é uma diferença assimétrica. Então, por exemplo:
> 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()
é uma função complicada porque a saída depende da ordem da entrada. Em vez disso, você pode escrever uma função simples que faz exatamente o oposto de intersect
. Isso é muito melhor.
>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
E se:
x <- c(1,2,3,4)
y <- c(2,3,4)
Qualquer uma dessas expressões:
setdiff(x, y)
x[!(x %in% y)]
x[is.na(match(x,y))]
x[!(is.element(x,y))]
lhe dará a resposta certa [1] 1
, se o objetivo for encontrar os valores / caracteres em x
, que não está presente em y
.
No entanto, aplicar as expressões acima pode ser complicado e pode dar resultados indesejáveis dependendo da natureza do vetor e da posição de xey na expressão. Por exemplo, se:
x <- c(1,1,2,2,3,4)
y <- c(2,3,4)
e o objetivo é apenas encontrar os valores / personagens únicos em x
, que não estão presentes em y
ou vice-versa. Aplicar qualquer uma dessas expressões ainda dará a resposta certa[1] 1
:
union(setdiff(x, y), setdiff(y, x))
Graças à contribuição de Jeromy Anglim
OU:
difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}
difference(y,x)
Graças à contribuição da Workhouse
setdiff(x,y)
esetdiff(y,x)
não são os mesmos.