Programa R para Biologia da Conservação
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Brincando com a Indexação

3 participantes

Ir para baixo

Brincando com a Indexação Empty Brincando com a Indexação

Mensagem por Daniel Papa Sáb Out 29, 2016 8:00 pm

Olá pessoal, boa noite.

Minha dúvida é quanto ao uso combinado de duas condições com o símbolo &.
O conteúdo está na aula 1.8. Explorando seus dados no R - Parte 2, 20'20'' (vinte minutos e vinte segundos)

O comando funcionou bem:
Comprimento[Manchas>1 & Espécie =="sp_2"]

Porém, ao tentar mais de umas combinações, o comando não funciona:

Comprimento[Espécie == "sp_1" & Manchas ==1 &  Manchas ==2]
ou
Comprimento[Espécie == "sp_1" & Espécie == "sp_2 & Manchas ==1]
ou
Comprimento[Espécie == "sp_1" & Manchas <2 &  Manchas >5]

Talvez a combinação não faça muito sentido, mas a dúvida principal é: posso colocar vários & e montar quantas combinações eu quiser?

Obrigado pelos esclarecimentos!
Um abraço e bom curso a tod@s.
Daniel Papa
Daniel Papa

Mensagens : 4
Data de inscrição : 28/10/2016

Ir para o topo Ir para baixo

Brincando com a Indexação Empty Re: Brincando com a Indexação

Mensagem por Leandro de Macedo S. Reis Seg Out 31, 2016 2:12 pm

Oi Daniel,

  Estou começando no R agora também, mas quanto ao seu problema me parece que é o seguinte: quando você escreveu a expressão você particionou a mesma coluna mais de uma vez, e o R não entendeu. Como se trata da "mesma coisa", por exemplo, Manchas, acredito que você deva concatenar. Por exemplo:

hist(Comprimento[Espécie=="sp_1" & Manchas==c(2,3)])

   Aqui eu disse ao R: olha R, pegue apenas a espécie 1 com valores de Manchas 2 e 3. Como Manchas é um vetor contendo vários valores, é preciso dar ao R uma informação única, que no caso foi "pegue os valores 2 e 3". Quando concatenamos o R entende como uma informação pertencendo aquele vetor. Do contrário, ele lê como outro argumento e não roda.

Também fiz assim (mas agora para espécie):

hist(Comprimento[c(Espécie=="sp_1",Espécie=="sp_3") & Manchas <=2])

    Eu mudei a informação de Manchas para "pegue aqueles que tem Manchas <=2 (menor ou igual a 2). E as informação de Espécies eu disse: "pegue as Espécies sp_1 e sp_3".

 Não sei se ajudei. Se por acaso eu tiver errado, por favor, podem me corrigir.

Abraços,


Leandro.

Leandro de Macedo S. Reis

Mensagens : 3
Data de inscrição : 26/10/2016

Ir para o topo Ir para baixo

Brincando com a Indexação Empty Re: Brincando com a Indexação

Mensagem por Prof. Marcos Seg Out 31, 2016 6:51 pm

Oi, Daniel e Leandro

O bom do fórum é que os problemas de vez em quando se resolvem sem a minha ajuda, hehehe Very Happy

O que o Leandro disse está no caminho certo, Daniel. Mas ainda não está completamente certo... Vamos lá!

O seu primeiro comando:
Comprimento[Espécie == "sp_1" & Manchas ==1 & Manchas ==2]
É o mesmo que pedir ao R para mostrar os dados de Comprimento para a sp_1 para os indivíduos que possuem 1 e 2 manchas. 1 e 2 no sentido literal, de ter as duas características ao mesmo tempo! Como isto é impossível, ele não retorna valores.

A alternativa similar à feita pelo Leandro seria esta:
Comprimento[Espécie == "sp_1" & Manchas ==c(1,2)]
Mas ainda não está correta. Para ser bem honesto, eu ainda não entendi por que ele não retorna os valores corretamente, estou tentando entender completamente.

Mas, de qualquer forma, uma forma correta seria esta:
Comprimento[Espécie == "sp_1" & Manchas <= 2]
Que é dizer para pegar os dados da sp_1 com 2 ou menos manchas.

É apenas "uma" forma correta, porque podemos fazer assim (mais complicado, mas útil para se entender como funciona a lógica do R):
Comprimento[Espécie == "sp_1" & Manchas == 1 | Espécie == "sp_1" & Manchas == 2]
Que é dizer para o R que queremos os dados da sp_1 com 1 mancha, ou os dados da sp_1 com 2 manchas. O "ou" aqui (que é simbolizado pelo | ) representa que as duas combinações valem pra gente.

Vou continuar tentando entender por que o concatenar ali não funciona, com certeza tem uma lógica por trás. Mas o importante é ter em mente que nestas seleções temos que ser o mais literais quanto pudermos, como no exemplo que eu dei. É como se estivesse explicando nos mínimos detalhes, mesmo que pareça redundante.

Agora, percebam que estes exercícios são bem legais para entendermos as coisas no R. Mas se formos de fato fazermos um monte de filtragem nos dados, muitas vezes fazemos isso em etapas, criando novos objetos a cada etapa e salvando o resultado. Só para vocês terem uma ideia do que eu quero dizer isso, vejam o exemplo abaixo:

Código:

#Aqui eu separo os dados por espécie:
dados.divididos<-split(dados, Espécie)

#Agora eu crio um objeto só com os dados da espécie 1:
dados.sp1<-dados.divididos[[1]]

#Agora eu separo apenas os que possuem 2 manchas ou menos:
dados.sp1.divididos<-split(dados.sp1, dados.sp1$Manchas<=2)

#E salvo em um objeto:
dados.sp1.menosmanchas<-dados.sp1.divididos$T

Agora, a função split é prática em casos pequenos. Existem funções bem mais legais e intuitivas no pacote dplyr. É um pacote fantástico para se mexer com dados, filtrando, colando, transpondo e coisas assim. Pretendo gravar algo sobre ele pro nosso módulo extra, é um pacote que comecei a explorar há apenas uns meses atrás.

Ufa, ficou grande! Qualquer coisa vamos nos falando! Wink
Prof. Marcos
Prof. Marcos

Mensagens : 678
Data de inscrição : 23/12/2015
Idade : 42
Localização : Maceió, AL

https://cantinhodor.wordpress.com/

Ir para o topo Ir para baixo

Brincando com a Indexação Empty Re: Brincando com a Indexação

Mensagem por Leandro de Macedo S. Reis Ter Nov 01, 2016 9:59 am

Bom dia Professor Marcos e Daniel,

     Eu fiquei mexendo no R para entender o que eu diz de errado. Quando rodo a minha expressão dá um gráfico diferente daquele feito pelo professor Marcos. Coloquei todos na mesma escala e vi que, na minha expressão, o valor 38 foi excluído. Então fui ver quantos valores existiam em cada uma das expressões criadas: a minha e a do professor Marcos. Para minha surpresa a minha expressão pega apenas 13 dos 25 valores. Fiquei pensando e procurei, mas não encontrei nada. Sabem me dizer o porque dessa diferença quando uso CONCATENAR na expressão? Vou deixar ela aqui em baixo só para ficar mais fácil de lembrar.


hist(Comprimento[Espécie=="sp_1" & Manchas==c(1,2)])


Muito obrigado pela ajuda,

Leandro

Leandro de Macedo S. Reis

Mensagens : 3
Data de inscrição : 26/10/2016

Ir para o topo Ir para baixo

Brincando com a Indexação Empty Re: Brincando com a Indexação

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo


 
Permissões neste sub-fórum
Não podes responder a tópicos