Diferença entre o = = e %em% operadores em R [duplicado]
esta pergunta já tem uma resposta aqui:
- diferença entre '%em% 'e `=' 2 respostas
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?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.
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.
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
==
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