Diferença entre o = = e %em% operadores em R [duplicado]

esta pergunta já tem uma resposta aqui:

a minha pergunta diz respeito à diferença prática entre os operadores == e %in% em R.

encontrei uma instância no trabalho em que a filtragem com qualquer operador dá resultados diferentes (por exemplo, um resultado em 800 linhas)., e os outros 1200). Deparei-me com este problema no passado e sou capaz de validar de forma a garantir que obtenho os resultados que desejo. No entanto, continuo perplexo quanto à sua diferença.

Alguém pode esclarecer como estes operadores são diferentes?

Author: zx8754, 2017-03-07

4 answers

%in% é valor correspondente e "retorna um vetor de posições de (primeiro) partidas de seu primeiro argumento em seu segundo" (Ver help('%in%')) Isso significa que você poderia comparar vetores de tamanhos diferentes para ver se os elementos de um vetor corresponde pelo menos um elemento em outro. O comprimento da saída será igual ao comprimento do vetor que está sendo comparado (o primeiro).

1:2 %in% rep(1:2,5)
#[1] TRUE TRUE

rep(1:2,5) %in% 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

#Note this output is longer in second

== is logical operator mean to compare if two things are exactly equal. Se os vetores são de igual comprimento, elementos serão comparados elemento-sábio. Caso contrário, os vectores serão reciclados. O comprimento da saída será igual ao comprimento do vetor maior.

1:2 == rep(1:2,5)
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

rep(1:2,5) == 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

1:10 %in% 3:7
#[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

#is same as 

sapply(1:10, function(a) any(a == 3:7))
#[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

Nota: se possível, tente usar identical ou all.equal em vez de == e.

 8
Author: d.b, 2017-03-13 15:07:34

Tente para objetos de comprimento diferente.

ac <- c("a", "b", "c")
ae <- c("a", "b", "c", "d", "e")
ac %in% ae
[1] TRUE TRUE TRUE
ac == ae
[1]  TRUE  TRUE  TRUE FALSE FALSE
Torna-se claro que %in% verifica se o objecto está ou não contido no outro objecto. Considerando que == é um operador lógico que verifica as propriedades da identidade.
 3
Author: jchaykow, 2017-03-06 22:57:32

Dado dois vetores, x e y, o código x == y irá comparar o primeiro elemento de x com o primeiro elemento de y e, em seguida, o segundo elemento de x com o segundo elemento de y, e assim por diante. Ao usar x = = y, os comprimentos de x e y devem ser os mesmos. Aqui, comparar significa "é igual a" e portanto a saída é um vetor lógico igual ao comprimento de x (ou y).

No código x %em % y , o primeiro elemento de x é comparado a todos os elementos em y, então o segundo elemento de x é comparado a todos elementos de y, e assim por diante. Aqui, compare means "is the current element of x equal to any value in y" and therefore the output is a logical vector that has the same length of x and not (necessarily) Y.

Aqui está um excerto de código que ilustra a diferença. Note que x e y têm os mesmos comprimentos, mas os elementos de y são os elementos de x em ordem diferente. Note também nos exemplos finais que x é um vetor de 3 elementos sendo comparado a o vector letras, que contém 26 elementos.
> x <- c('a','b','c')
> y <- c('c', 'b', 'a')
> x == y
[1] FALSE  TRUE FALSE

> x %in% y
[1] TRUE TRUE TRUE

> x %in% letters
[1] TRUE TRUE TRUE

> letters %in% x
 [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [7] FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE
 1
Author: Jaguar, 2017-03-06 23:25:44

== Se elementos de um vetor são iguais a todos os elementos de outro vetor. Idealmente, dois vetores terão o mesmo tamanho (ou terá resultados inesperados como quando os tamanhos não coincidem com o R reciclam o vetor mais curto, silenciosamente se os tamanhos são múltiplos uns dos outros). Por exemplo

c(1,2,3) == c(1,3,2)
[1]  TRUE FALSE FALSE

Ou

c(1,2) == c(1,3,2)
[1]  TRUE FALSE FALSE
Warning message:
In c(1, 2) == c(1, 3, 2) :
  longer object length is not a multiple of shorter object length

%in% por outro lado, verifica quais os elementos da lista 1 que estão incluídos na lista 2

c(1,2,3) %in% c(1,3,2)
[1]  TRUE TRUE TRUE

Ou

c(1,2) %in% c(1,3,2)
[1] TRUE TRUE
 0
Author: OganM, 2017-03-06 23:25:07