às vezes eu me pergunto por R simplesmente não usar a palavra contém para torná-lo mais fácil aos usuários
greg121
12
considere que "in" está contido em "conta (in) s"; Eu diria que "in" é um concorrente consideravelmente conciso nesse contexto
encerrado em 11/03/16
1
Talvez com a adição de %sinais de flanqueamento . A palavra iné uma palavra reservada no uso de R na construção de loop for.
IRTFM
@ greg121 O dplyr já tem uma função contains , mas é usado para uma finalidade diferente: selecionar uma coluna em um quadro de dados. Por exemplo select(iris, contains("etal")).
Paul Rougieux 14/0318
Existe uma maneira concisa de fazer números reais com uma precisão determinada?
Mlt #
Respostas:
500
As funções match()(retorna a primeira aparência) e %in%(retorna um booleano) são projetadas para isso.
v <- c('a','b','c','e')'b'%in% v## returns TRUE
match('b',v)## returns the first location of 'b', in this case: 2
Eu sei que a documentação diz is.element(x, y) is identical to x %in% y. Mas, eu não sei porque, is.elementsfunciona quando a mistura de números inteiros e numéricos e %in%não
pomber
@ pomber: Você poderia dar um exemplo disso?
discipulus
@pomber é fixo?
precisa saber é o seguinte
2
A legibilidade superior is.element()vs %in%é subjetiva. Pode-se argumentar que um operador infix é mais legível porque elimina a ambiguidade na ordem dos argumentos. apple in fruitfaz sentido, fruit in applenão. is.element(apple, fruit)ou is.element(fruit, apple)ambos podem estar certos, dependendo da implementação da is.elementfunção.
rileymcdowell
70
Vou agrupar as opções com base na saída. Suponha o seguinte vetor para todos os exemplos.
v <- c('z','a','b','a','e')
Para verificar a presença:
%no%
>'a'%in% v[1]TRUE
qualquer()
> any('a'==v)[1]TRUE
is.element ()
> is.element('a', v)[1]TRUE
Para encontrar a primeira ocorrência:
partida()
> match('a', v)[1]2
Para encontrar todas as ocorrências como vetor de índices:
qual()
> which('a'== v)[1]24
Para encontrar todas as ocorrências como vetor lógico :
==
>'a'== v
[1]FALSETRUEFALSETRUEFALSE
Edit: Removendo grep () e grepl () da lista pelo motivo mencionado nos comentários
whichàs vezes é preferível, pois fornece todas as posições correspondentes (como uma matriz), ao contrário match. Embora talvez não tenha sido o que o OP solicitou, diferentemente do stackoverflow.com/questions/1169388/…
Fizz
2
Por que se preocupar whichse você só quer encontrar os elementos que não estão Tset? Você pode apenas indexar popdiretamente; pop[!pop%in%Tset]
Houshalter
13
Eu realmente gosto de grep () e grepl () para esse fim.
grep () retorna um vetor de números inteiros, que indica onde estão as correspondências.
yo <- c("a","a","b","b","c","c")
grep("b", yo)[1]34
grepl () retorna um vetor lógico, com "TRUE" no local das correspondências.
yo <- c("a","a","b","b","c","c")
grepl("b", yo)[1]FALSEFALSETRUETRUEFALSEFALSE
Essas funções diferenciam maiúsculas de minúsculas.
Por padrão, grepassume uma expressão regular como seu primeiro elemento, para fazer uma correspondência exata de "b", usar ^e$ou adicionar , fixed=TRUE).
reinierpost
10
Não use regex para correspondências exatas. Isso é perigoso e pode ter resultados inesperados
David Arenburg
9
Sim, essa é uma péssima, ruim, muito má idéia - ineficiente e com garantia de quebra. Por exemplo myvar <- 'blah'; grepl('b', myvar, fixed=TRUE), retornará TRUEmesmo que 'b' não esteja myvar.
%
sinais de flanqueamento . A palavrain
é uma palavra reservada no uso de R na construção de loop for.select(iris, contains("etal"))
.Respostas:
As funções
match()
(retorna a primeira aparência) e%in%
(retorna um booleano) são projetadas para isso.fonte
which(v, 'b')
. Observe a ordem dos argumentos.which(v, 'b')
me dá uma mensagem de erro:> Erro no qual (v, 'b'): argumento para 'qual' não é lógicois.element()
cria um código mais legível e é idêntico ao%in%
fonte
is.element(x, y) is identical to x %in% y
. Mas, eu não sei porque,is.elements
funciona quando a mistura de números inteiros e numéricos e%in%
nãois.element()
vs%in%
é subjetiva. Pode-se argumentar que um operador infix é mais legível porque elimina a ambiguidade na ordem dos argumentos.apple in fruit
faz sentido,fruit in apple
não.is.element(apple, fruit)
ouis.element(fruit, apple)
ambos podem estar certos, dependendo da implementação dais.element
função.Vou agrupar as opções com base na saída. Suponha o seguinte vetor para todos os exemplos.
Para verificar a presença:
%no%
qualquer()
is.element ()
Para encontrar a primeira ocorrência:
partida()
Para encontrar todas as ocorrências como vetor de índices:
qual()
Para encontrar todas as ocorrências como vetor lógico :
==
Edit: Removendo grep () e grepl () da lista pelo motivo mencionado nos comentários
fonte
grep()
ou expressões regulares para encontrar correspondências exatas.A função any () cria código legível
fonte
%in%
:any(1==NA)
retornaNA
, onde1 %in% NA
retornaFALSE
.any(1==NA, na.rm=TRUE)
retornaFALSE
.Você pode usar o
%in%
operador:fonte
Também para encontrar a posição do elemento "qual" pode ser usado como
e para encontrar os elementos que não estão contidos no vetor alvo, pode-se fazer o seguinte:
fonte
which
às vezes é preferível, pois fornece todas as posições correspondentes (como uma matriz), ao contráriomatch
. Embora talvez não tenha sido o que o OP solicitou, diferentemente do stackoverflow.com/questions/1169388/…which
se você só quer encontrar os elementos que não estãoTset
? Você pode apenas indexarpop
diretamente;pop[!pop%in%Tset]
Eu realmente gosto de grep () e grepl () para esse fim.
grep () retorna um vetor de números inteiros, que indica onde estão as correspondências.
grepl () retorna um vetor lógico, com "TRUE" no local das correspondências.
Essas funções diferenciam maiúsculas de minúsculas.
fonte
grep
assume uma expressão regular como seu primeiro elemento, para fazer uma correspondência exata de"b"
, usar^e$
ou adicionar, fixed=TRUE
).myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)
, retornaráTRUE
mesmo que 'b' não estejamyvar
.