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?
você pode usar a função setdiff () (definir diferença):
> setdiff(x, y)
[1] 1
setdiff(x,y)
esetdiff(y,x)
não são os mesmos.Sim. Para vetores, você pode simplesmente usar o
%in%
operador ouis.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 .fonte
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 dex
que não estão emy
.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
fonte
fonte
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 deintersect
. 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
fonte
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 emx
, que não está presente emy
.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 emy
ou vice-versa. Aplicar qualquer uma dessas expressões ainda dará a resposta certa[1] 1
: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
fonte