Teoria de Conjuntos

O estudo da teoria de conjuntos visa oportunizar o aprendizado de relações básicas desenvolvidas em operações matemáticas e na resolução de problemas. Além disso, o estudo da teoria de conjutnos fornece elementos que podem servir de base para o aprendizado de programação e também de bancos de dados.

Ao obter coleções de elementos classificados a partir de certas características, estamos formando conjuntos. Os animais vertebrados, por exemplo, podem ser divididos em cinco classes: peixes, anfíbios, répteis, mamíferos e aves. Cada uma dessas classes de animais forma um conjunto. Na matemática, a ideia de conjunto é fundamental e está presente em diversos conceitos. Podemos formar conjuntos a partir de elementos de diferentes naturezas, tais como objetos, pessoas e números.

Exemplos
• Conjunto dos números naturais menores que 6: A = {1, 2, 3, 4, 5}
• Conjunto das vogais do nosso alfabeto: B = {a, e, i, o, u}
• Conjunto dos continentes: C = {África, América, Ásia, Europa, Oceania}
• Conjunto dos números pares positivos menores que 100: D = {2, 4, 6, 8, …, 100}

Neste trabalho será apresentado um material elaborado pelos autores que visa oportunizar o aprendizado de teoria de conjuntos com a complementação de atividades usuais presentes em livros didátivos com procedimentos computacionais dessenvolvidos no software R e através do seu GUI RStudio.

O software R é uma linguagem e, ao mesmo tempo, um ambiente computacional estatístico que permite a realização de cálculos, simulações e desenvolvimento de modelos. Permitindo a realização de uma grande variedade de cálculos matemáticos, estatísticos, construção de gráficos e simulações (BECHER; MACHADO, 2018.

Uma característica muito importane e útil do R é que ele permite o acréscimo de packages, que são extensões desenvolvidas e distribuidas por usuários que facilitam a realização de certos procedimentos ou adicionam novas funcionalidades. No estudo da teoria de conjuntos além do R e do RStudio também precisaremos do package VennDiagram.


Representando Conjuntos

Cada componente de um conjunto é denominado elemento e, de maneira geral, os conjuntos são indicados por letras maiúsculas e seus elementos ou são dispostos entre chaves separados por vírgula ou ainda podem ser indicados a partir da Regra ou Lei de Formação que indica quais são os seus elementos.

Exemplos
• Conjunto dos números naturais impares menores que 10: A = {1, 3, 5, 7, 9}
• Conjunto dos números maiores que 10 e menores que 20: B = {x|x é um número maior que 10 e menor do que 20}

Um conjunto também pode ser indicado por meio de uma figura chamada Diagrama de Venn. Quando um elemento compõe um conjunto, dizemos que ele elemento pertence ao conjunto. De maneira semelhante, quando ele não compõe o conjunto, dizemos que ele não pertence ao conjunto.

Exemplo:

Podemos escrever que: \(7\in E\) ou, quando o elemento não pertence ao conjunto \(8 \notin E\).


Exercícios
  1. Determine a lei de formação de cada cojunto e faça a representação por meio de um diagrama de Venn.
  1. Conjunto das notas músicais;
  2. Estados da região sul do Brasil;
  3. Números pares, maiores que 0 e menores que 10.
  1. Relacione cada elemento abaixo com os conjuntos A = {x|x é par e divisor de 20} e B = {x|x2 é quadrado perfeito}.
  1. 4
  2. 6
  3. 10
  4. 16
  5. 25
  6. 50
  1. O conjunto D é formado pelos números quadrados perfeitos ímpares menores que 150. Quantos elementos pertencem ao conjunto D?

  2. (Unifor - CE, Adaptada) Seja o número 6X3Y, em que X e Y substituem os algarismos das centenas e das unidades, respectivamente. Determine o total de pares de valores (X, Y) que tornam tal número divisível por 15 e escreva a lei de formação do conjunto destes pares, fazendo a uma representação através de um diagrama de Venn.


Como criar conjuntos no R?

Para criar-se conjuntos no R o modo mais intuitivo e simples é procedermos a digitação dos elementos diretamente na linha de comando. Cabe notar que neste processo também devemos indicar o nome do conjunto no qual os elementos ficaram armazenados. O que é feito através do comando c que indica para o R combinar ou concatenar os valores mencionados.
No caso de valores numéricos basta digitarmos os valores diretamente, entretanto no caso de elementos alfabuméricos é preciso colocá-los entre aspas.


Quando dois conjuntos são iguais?

Dois conjuntos A e B são iguais quando eles possuem os mesmos elementos, ainda que algum deles possa ser repetido. Ou seja, dois conjuntos são iguais quando possuem os mesmo elementos, independente da quantidade. Se a igualdade for verificada escrevemos \(A = B\).
Por outro lado, dois conjuntos não são iguais quando pelo menos um dos elementos pertence a apenas um dos conjuntos e, nestes casos escrevemos \(A\neq B\).
Por exemplo, o conjunto A={x|x é um número maior que -2 e menor ou igual a 4} e o conjunto B={-1, 0, 1, 2, 3, 4} possuem os mesmo elementos e, assim os conjuntos A e B sáo ditos iguais.


Trés formas de criar conjuntos sequenciais no R

A forma mais simples para gerar um sequência no R é usando :. Neste caso basta indicarmos o inicio e o final da sequência. Por exemplo: 1:10 irá produzir uma sequência e números inteiros que inicia em 1 e termina em 10.
A segunda forma de gerar sequências é com o uso do comando seq. Este comando permite a criação de sequências com intervalo diferente de um inteiro. Por exemplo: seq(1, 10, 2) irá gerar uma sequência que inicia no número 1 e terá um intervalo de duas unidades até o próximo termo, sendo o último termo da sequência igual a 10 ou então o menor valor que respeito o intervalo indicado. Com o comando seq é possível gerar sequências decrescentes especificando o intervalo com um valor negativo.
Por fim, a terceira forma de gerar conjuntos sequenciais é usando o comando rep. Neste comando devemos indicar o valor que será repetido e quantas vezes isso acontecerá. Por exemplo: rep(2,5) irá criar um sequência com o número 2 repetido 5 vezes. Já se quisermos especificar um número de repetições diferentes para cada valor podemos fazer: rep(c("A", "B", "C"), c(3, 4, 2)).

Conjuntos unitário, vazio, universo e subconjunto

  • Um conjunto A que possui um único elemento é chamado de conjunto unitário. Os conjuntos A={4} e B={x|x é um número primo par} são exemplos de conjuntos unitários.
  • Por outro lado, dizemos que A é um conjunto vazio quando ele não possui elemento algum. Podemos indicar um conjunto vazio por { }. Um exemplo de conjunto vazio é A={x|x é um número impar divisível por 2}.
  • Chamamos de conjunto universo e indicamos por U, aquele conjunto ao qual pertencem todos os elementos considerados em determinado situação.
  • Quando todos os elementos de um cojunto W pertencem a um outro conjunto P, dizemos que W é subconjunto de P, ou seja, todos os elementos do conjunto W estão contidos no conjunto P.
    • Todo conjunto é subconjunto dele mesmo.
    • O conjunto vazio, por convenção, é subconjunto de qualquer conjunto.
    • Se um conjunto A possuir n elementos, então existirão \(2^{n}\) subconjuntos de A.

Exercícios
  1. Determine quais dos conjuntos abaixo são iguais.
  1. A={x|x é um número inteiro maior que 1}
  2. B={x|X é 36}
  3. C={x|x é um número natural negativo}
  4. D={ }
  5. E={2,3}
  6. F={x|x é a solução da equação \(x^{2}-5x+6=0\)}
  7. G={x|x é primo e divisor de 84}
  8. H={2, 3, …}
  9. I={6}
  10. J={2, 3, 7}
  1. Classifique as afirmações abaixo em verdadeira ou falsa.
  1. Se A={x|x é primo e \(14<x<17\)}, então A é vazio.
  2. Todo conjunto unitário possui mais de um elemento.
  3. A equação \(3x+20=0\) não possui solução no conjunto dos números naturais.
  4. O conjunto solução da equação \(x^{2}=0\) é vazio.

Criando diagramas Venn no R

Para criamos diagramas Venn no R vamos utilizar um package chamado VennDiagram. Iniciamos abrindo o RStuido e depois carregando o VennDiagram digitando:

library(VennDiagram)

Uma vez carregado o package podemos começar as representações. Vamos iniciar representando apenas um conjunto. Para isso primeiro vamos delimitar o número de elementos do conjunto para depois fazermos a sua representação com a ajuda do VennDiagram. Neste caso vamos armazenar o número de elementos na variável a porém poderíamos informar diretamente na linha de comando.

a1<- 22
draw.single.venn(area = a1, category = "Area 1")

Algumas características do diagrama criado podem ser alteradas pelos seguintes comandos:
lty = retira a linha ou altera a cor
fill = cor de preenchimento
alpha = transparência

draw.single.venn( area = a1, category = "Area 1", lty = "blank", fill = "blue", alpha =.3)

Depois de aprender a fazer a representação do diagrama de um conjunto vamos passar para o passo seguinte que é representar dois conjuntos. A primeira coisa a fazer é criar o vetor indicando a quantidade de elementos do segundo conjunto a2<- 20.

Feita a criação do segundo vetor vamos criar o diagrama com dois conjuntos.

draw.pairwise.venn(area1 = a1, area2 = a2, cross.area = 11, category = c("Area 1", "Area 2"))

Da mesma forma como foi feito com a represntação de um único conjunto também podemos alterar a cor de preenchimento, as linhas e a transparência repectivamente com fill, lty e alpha. Contudo, aqui também incluímos o parâmetro cat.pos que define a posição das legendas dos conjuntos e varia entre 0 e 360 graus.
Observe que indicamos através das variáveis a1 e a2 a quantidade de elementos dos conjuntos e a quantidade de elementos da interseção é indicada no parâmetro cross.area dentro do comando draw.pairwise.venn. Contudo, como já mencionado, em construções simples poderíamos indicar diretamente no comando draw.pairwise.venn todos os valores.

A seguir vamos refazer o diagrama anterior alterando algumas características.

draw.pairwise.venn(a1, a2, 11, category = c("Area 1", "Area 2"), lty = rep("blank", 2), fill = c("light blue", "red"), alpha = c(0.3, 0.2), cat.pos = c(0, 0))

Se quisermos fazer a representação de dois conjuntos disjuntos, ou seja, que não possuem nenhuma interseção devemos definir o parâmetro cross.areacomo 0, para indicar que não existem elementos em comum.

draw.pairwise.venn(area1 = a1, area2 = a2, cross.area = 0, category = c("Area 1", "Area 2"), cat.pos = c(0, 180))

Então… agora vamos começar a deixar as coisas um pouco mais complexas com a representação de 3 conjuntos.
Da mesma forma como foi feito antes, uma vez que vamos reaproveitar os dois vetores anteriormente criados, o primeiro passo é criar o vetor indicativo da quantidade de elementos do terceiro conjunto a3<- 14.

Na sequência usamos a função draw.triple.venndo package VennDiagram para fazer a representação desejada mas, observe que é necessário indicar também o valor das interseções entre os três conjuntos nos parâmetros n12, n23, n13 e n123.

draw.triple.venn(area1 = a1, area2 = a2, area3 = a3, n12 = 11, n23 = 4, n13 = 5, n123 = 2)

Para adicionar alguns efeitos que ajudam na hora de analisar o diagrama podemos proceder da mesma forma como foi feito com os diagramas mais simples.

draw.triple.venn(area1 = a1, area2 = a2, area3 = a3, n12 = 11, n23 = 4, n13 = 5, n123 = 2, category = c("Area 1", "Area 2", "Area 3"), lty = "blank", fill = c("skyblue", "yellow", "pink"))


Operações com Conjuntos

União

Considere os conjuntos A = {2,4,6,8,10} e B = {1,2,3,4,5}. Podemos escrever um conjunto C formado por todos os elementos que pertencem a A e B, logo, C = {1,2,3,4,5,6,8,10}.
Definimos o conjunto C como o conjunto união dos conjuntos A e B e indicamos por \(A \cup B=C\). Assim, também podemos escrever A \(\cup\) B= {x|x \(\in\) A ou x \(\in\) B}.
Utilizando um diagrama Venn a representação da união de dois conjuntos fica:

Como fazer união no R

Primeiro devemos criar os conjuntos para depois, com o uso do comando union realizar a união.

Intersecção

Considerando os conjuntos A e B utilizados na operação de união, o conjunto C formado por todos os elementos que fazem parte de A e B simultâneamente é chamado de intersecção de A e B, ou seja, C = {2,4}. A interesecção dos conjuntos A e B é indicada por A \(\cap\) B e temos que A \(\cap\) B = {x|x \(\in\) A e x \(\in\) B}.

Como fazer a intersecção no R

Assim como na união devemos criar os conjuntos que desejamos interseccionar para depois, usando o comando ´intersect´ determinarmos a intersecção dos conjuntos.

Diferença entre Conjuntos

Ainda considerando os conjuntos A e B, podemos chamar o conjunto C formado por todos os elementos pertencentes a A e não pertencem a B, como o conjunto diferença entre A e B. ou seja C = {6,8,10}. Indicamos por A – B = {x|x \(\in\) A e x \(\notin\) B}.

Como fazer a diferença entre conjuntos no R

Iniciamos criando os conjuntos que queremos subtrair e usando o comanod `setdiff´ encontramos a diferança do primeiro conjunto e relação ao segundo. Observe que esta fazer \(A - B\) é diferente de fazer \(B - A\). ***

Exercícios
  1. Considerando os conjuntos A={1,2,5}, B={1,3}, C={5,6,7,8} e D={7,8,9} determine:
  1. A\(\cup\)B
  2. A\(\cup\)C
  3. D\(\cup\)B
  4. (A\(\cap\)B)\(\cup\)C
  5. (B\(\cup\)C)\(\cap\)D
  6. (C\(\cap\)A)\(\cup\)(D\(\cup\)B)

Nota
Quantos elementos a união de dois conjuntos terá?
Observe o seguinte exemplo…
Dados dois conjuntos A={a,b,c,d,e,f,g,h,i} e B={a,e,i,o,u} teremos n(A)=9 e n(B)=5. Contudo, ao realizarmos a união dos conjunots A e B teremos elementos em comum, assim precisamos descontar esta quantidade de elementos da soma direta. Para fazer isso determinamos o número de elementos da intersecção dos conjuntos A e B e obtemos n(A\(\cap\)B)=3.
Desta forma o conjunto formado pela união terá 11 elementos (11 = 9+5-3).

Podemos representar este procedimento por: n(A\(\cup\)B)=n(A)+n(B)-n(A\(\cap\)B)

  1. (UEL – PR) Um instituto de pesquisas entrevistou 1000 indivíduos, perguntando sobre sua rejeição aos partidos A e B. Verificou-se que 600 pessoas rejeitaram o partido A; que 500 pessoas rejeitavam o partido B e que 200 pessoas não rejeitavam nenhum partido. O número de indivíduos que rejeitavam os dois partidos é de:
  1. 120 pessoas
  2. 200 pessoas
  3. 250 pessoas
  4. 300 pessoas
  5. 800 pessoas
  1. (PUC-Rio-2009) Em um colégio, de 100 alunos, 80 gostam de sorvete de chocolate, 70 gostam de sorvete de creme e 60 gostam dos dois sabores. Quantos alunos não gostam de nenhum dos dois sabores?
  1. 0
  2. 10
  3. 20
  4. 30
  5. 40
  1. Sabendo que A = {0, 1, 2, 3, 4, 5, 6}, B = {6, 7, 8, 9} e C = {2, 4, 6, 8, 10}, quais são os elementos do conjunto (A∩B)UC?
  1. Os mesmos do conjunto A
  2. Os mesmos do conjunto B
  3. {6}
  4. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  5. Os mesmos do conjunto C
  1. (PUCSP) Numa pesquisa de mercado, verificou-se que 15 pessoas utilizam pelo menos um dos produtos A ou B. Sabendo que 10 dessas pessoas não usam o produto B e que 2 dessas pessoas não usam o produto A, qual é o número de pessoas que utilizam os produtos A e B?
  1. 0
  2. 2
  3. 3
  4. 4
  5. 5


Agora que já sabemos como funcionam as operações com conjuntos vamos colocar o R para trabalhar para a gente, fazendo com que ele faça a contagem dos elementos e gere os diagrams de Venn que representem as relações nas quais estamos interessados.
É importante perceber que teremos duas situações diferentes, a primeira estaremos contando elementos armazenados em um vetor e na segunda contaremos elementos armazenados em um dataframe.

Automatizando a contagem dos elementos de um conjunto

Já vimos como criar diagramas utilizando o package VennDiagram vamos tormar o processo um pouco mais automatizado e interessante, com o R não só podemos criar os diagramas mas também faze-lo contar os elementos de cada conjunto e suas respecitivas interseções utilizando os comandos que aprendemos há pouco.
Antes de tudo primeiro criaremos quatro vetores e também uma paleta de cores. Os vetores serão os nossos conjuntos e cada um terá 300 números, sorteados pelo R aleatóriamente entre 1 e 1000.
Uma paleta é um conjunto de corres que usaremos para representar os conjuntos quando criarmos os diagramas. Note que não precisamos definir uma paleta pois o R já tem cores pré-definidas contudo, como desejamos mostrar que é possível escolher as cores adotamos este procedimento.

set1<- sample(1:1000, 300)
set2<- sample(1:1000, 300)
set3<- sample(1:1000, 300)
set4<- sample(1:1000, 300)
colors<- c("#6b7fff", "#c3db0f", "#ff4059", "#2cff21")

Para calcularmos as quantidades de elementos de cada vetor utilizaremos a função length e, para encontrarmos a interseção dos conjuntos criados(vetores) usaremos a função intersect que encontra a interseção entre os conjuntos.

length(set1)
## [1] 300
intersect(set1, set2)
##   [1] 126 548 841 319 778 385 365 278 975  23 499 545 656 665 430 706  14 387
##  [19] 158 803 433 853 624 847 529 807 637 349 550 241 777  37 252 884 395 400
##  [37] 298 393 754 474 618 384 956 675 748 905 170 625  11 686 865 161 696 538
##  [55] 750 789 549 668 991 709 405 180 729 216 146 813 685  87 796 143 479 100
##  [73] 531 855  30  25 207 144 678 133 497  81 375 348 186 580 332 942 175 899
##  [91]   4 773 936 999 774 911   2 972 863 705
length(intersect(set1, set2))
## [1] 100

Os resultados apresentados acima exemplicam o uso das funções lengthe intersecte como podemos utilizá-las, ficando como exercício verificar as outras relações.

Podemos agora então adaptar o comando draw.triple.venn para fazer todo o trabalho.

draw.triple.venn(area1 = length(set1), area2 = length(set2), area3 = length(set3), n12 = length(intersect(set1, set2)), n23 = length(intersect(set2, set3)), n13 = length(intersect(set1, set3)), n123 = length(intersect(intersect(set1, set2), set3)), category = c("Set 1", "Set 2", "Set3"), fill = colors[1:3])


Automatizando a contagem com dataframes

Agora que já sabemos como contar os elementos de um conjunto e depois criar um diagrama de Venn vamos ampliar nossas possibilidades fazendo isso também com dataframes.
A primeira coisa a fazer é abrirmos o dataframe com o qual iremos trabalhar. Em nosso caso, ele se chama dante.

Podemos verificar que o dataframe tem 20 entradas e 11 colunas sendo 10 variáveis.

str(dante)
## 'data.frame':    20 obs. of  11 variables:
##  $ nome         : chr  "Antonio" "Artur" "Aurea" "Bruno" ...
##  $ sexo         : chr  "M" "M" "F" "M" ...
##  $ idade        : int  22 16 15 16 14 19 34 29 27 19 ...
##  $ altura       : int  169 174 163 164 168 165 177 159 162 169 ...
##  $ peso         : int  70 71 61 61 60 58 82 61 61 72 ...
##  $ irmaos       : int  2 1 0 0 1 1 1 3 2 2 ...
##  $ cabelo       : chr  "castanho" "loiro" "loiro" "castanho" ...
##  $ hobby        : chr  "musica" "musica" "ciclismo" "futebol" ...
##  $ sapato       : int  38 40 36 37 27 35 41 37 38 38 ...
##  $ manequim     : int  38 40 42 42 40 36 44 40 42 44 ...
##  $ desempenhomat: chr  "otimo" "bom" "insuficiente" "otimo" ...

Para fazermos o R contar o número de elementos de cada subconjunto primeiro vamos ver como fazer isso com dois subconjuntos. Incialmente vamos criar três subconjuntos que correspondem aos critérios que desejamos investigar. No nosso caso: caçar sapato 38 ou 39 e ter 22 anos de idade.

d1<- dante[dante$sapato == 38,]
d2<- dante[dante$sapato == 39,]
d12<- dante[(dante$sapato == 38 & dante$idade == 22) | ( dante$sapato == 39 & dante$idade == 22),]

Depois é que iremos criar os diagramas com as respectivas contagens. Observe que neste caso usaremos o comando nrowpara contar invés de length. Isso acontece porque agora estamos lidando com um dataframe e não com um vetor.

draw.pairwise.venn(nrow(d1), nrow(d2), cross.area = nrow(d12), category = c("Calca 38", "Calca 39"), lwd = c(1,2), col = c("coral", "cyan3"), cat.pos = c(330, 30), fill = c("light blue", "green"), alpha = c(0.4, 0.5))

Para ajudar vamos repetir o procedimento, mas desta vez procuraremos identificar os indivíduos quanto ao sexo (M ou F) que tenham 22 anos de idade.
Novamente o primeiro passo é filtar o dataframe.

d1<- dante[dante$sexo == "M",]
d2<- dante[dante$sexo == "F",]
d12<- dante[(dante$sexo == "M" & dante$idade > 22) | ( dante$sexo == "F" & dante$idade > 22),]

Depois de feita a filtragem com a criação dos subconjuntos d1, d2 e d12 geramos o diagrama de Venn.

draw.pairwise.venn(nrow(d1), nrow(d2), cross.area = nrow(d12), category = c("Masc", "Fem"), lwd = c(1,2), col = c("coral", "cyan3"), cat.pos = c(330, 30), fill = c("light blue", "royalblue1"), alpha = c(0.4, 0.5))

Ótimo trabalho até aqui!!! Mas agora vamos vazer um diagrama que considere três fatores.
O processo é o mesmo de antes só que agora precisamos considerar mais subconjuntos uma vez que existem mais intersecções.

Neste caso vamos identificar os indivíduos pelas seguintes características: ser loiro, gostar de música e ser ter um bom desempenho em matemática.

d1<- dante[dante$cabelo == "loiro",]
d2<- dante[dante$hobby == "musica",]
d3<- dante[dante$desempenhomat == "bom",]
d12<- dante[(dante$cabelo == "loiro" & dante$hobby == "musica"),]
d23<- dante[(dante$hobby == "musica" & dante$desempenhomat == "bom"),]
d13<- dante[(dante$cabelo == "loiro" & dante$desempenhomat == "bom"),]
d123<- dante[(dante$cabelo == "loiro" & dante$hobby == "musica" & dante$desempenhomat == "bom"),]

Agora vamos fazer o diagrama.

draw.triple.venn(area1 = nrow(d1), area2 = nrow(d2), area3 = nrow(d3), n12 = nrow(d12), n23 = nrow(d23), n13 = nrow(d13), n123 = nrow(d123), category = c("Loiro", "Musica", "Bom Mat"), cat.pos = c(340, 20, 0), fill = c("light blue", "royalblue1", "light green"), reverse = FALSE)


Como podemos verificar os resultados?

Para saber quem, qual caso, corresponde as características pesquisadas podemos usar o comando which. Neste primeiro exemplo existe apenas um caso que cumpre os três critérios estabelecidos. A função irá retornar qual é este caso.

which((dante$cabelo == "loiro" & dante$hobby == "musica" & dante$desempenhomat == "bom"))
## [1] 2

Neste segundo exemplo dois casos irão cumprir os dois critérios de busca.

which (dante$cabelo == "loiro" & dante$hobby == "musica")
## [1]  2 16

Mas e se eu quiser visualizar estes casos? Observe que o comando whichapenas indica qual é mas não o exibe na tela.

dante[which((dante$cabelo == "loiro" & dante$hobby == "musica" & dante$desempenhomat == "bom")),]
##    nome sexo idade altura peso irmaos cabelo  hobby sapato manequim
## 2 Artur    M    16    174   71      1  loiro musica     40       40
##   desempenhomat
## 2           bom

O caso exibido acima mostra a segunda linha do dataframe que apenas havia sido indicada anteriormente. Por outro lado o exemplo a seguir apresentará os dois casos identificados no segundo exemplo da função which.

dante[which (dante$cabelo == "loiro" & dante$hobby == "musica"),]
##     nome sexo idade altura peso irmaos cabelo  hobby sapato manequim
## 2  Artur    M    16    174   71      1  loiro musica     40       40
## 16 Mauro    M    15    168   59      3  loiro musica     39       40
##    desempenhomat
## 2            bom
## 16  insuficiente

Eventualmente pode ser necessário que se faça uma ordenação do dataframe. Isso pode ajudar a verificar quais casos cumpriam certos critérios. Para fazer isso podemos usar o comando order.

dante[order(dante$idade),]
##        nome sexo idade altura peso irmaos   cabelo    hobby sapato manequim
## 5     Carla    F    14    168   60      1    loiro basquete     27       40
## 3     Aurea    F    15    163   61      0    loiro ciclismo     36       42
## 16    Mauro    M    15    168   59      3    loiro   musica     39       40
## 2     Artur    M    16    174   71      1    loiro   musica     40       40
## 4     Bruno    M    16    164   61      0 castanho  futebol     37       42
## 14    Lucia    F    16    162   57      1 castanho   musica     35       38
## 15   Marcia    F    16    174   60      4    preto ciclismo     38       38
## 13    Laura    F    17    168   57      2    preto  futebol     36       36
## 12     Jose    M    18    171   65      2    preto  futebol     40       40
## 20    Vania    F    18    173   63      2 castanho  futebol     39       40
## 6   Claudia    F    19    165   58      1    ruivo basquete     35       36
## 10 Fernanda    F    19    169   72      2    preto   musica     38       44
## 18 Patricia    F    20    170   59      0    loiro      ler     38       38
## 17    Nivea    F    21    172   61      2 castanho      ler     37       38
## 1   Antonio    M    22    169   70      2 castanho   musica     38       38
## 11  Geraldo    M    22    173   83      0 castanho      ler     39       46
## 9    Flavia    F    27    162   61      2    loiro  corrida     38       42
## 19    Paula    F    27    164   56      1    loiro  corrida     35       36
## 8     Edite    F    29    159   61      3 castanho      ler     37       40
## 7  Domingos    M    34    177   82      1 castanho  futebol     41       44
##    desempenhomat
## 5        regular
## 3   insuficiente
## 16  insuficiente
## 2            bom
## 4          otimo
## 14           bom
## 15       regular
## 13           bom
## 12           bom
## 20           bom
## 6            bom
## 10       regular
## 18         otimo
## 17           bom
## 1          otimo
## 11           bom
## 9          otimo
## 19       regular
## 8          otimo
## 7   insuficiente

Já se precisarmos fazer a ordenção em ordem descrescente.

dante[order(dante$idade, decreasing = TRUE),]
##        nome sexo idade altura peso irmaos   cabelo    hobby sapato manequim
## 7  Domingos    M    34    177   82      1 castanho  futebol     41       44
## 8     Edite    F    29    159   61      3 castanho      ler     37       40
## 9    Flavia    F    27    162   61      2    loiro  corrida     38       42
## 19    Paula    F    27    164   56      1    loiro  corrida     35       36
## 1   Antonio    M    22    169   70      2 castanho   musica     38       38
## 11  Geraldo    M    22    173   83      0 castanho      ler     39       46
## 17    Nivea    F    21    172   61      2 castanho      ler     37       38
## 18 Patricia    F    20    170   59      0    loiro      ler     38       38
## 6   Claudia    F    19    165   58      1    ruivo basquete     35       36
## 10 Fernanda    F    19    169   72      2    preto   musica     38       44
## 12     Jose    M    18    171   65      2    preto  futebol     40       40
## 20    Vania    F    18    173   63      2 castanho  futebol     39       40
## 13    Laura    F    17    168   57      2    preto  futebol     36       36
## 2     Artur    M    16    174   71      1    loiro   musica     40       40
## 4     Bruno    M    16    164   61      0 castanho  futebol     37       42
## 14    Lucia    F    16    162   57      1 castanho   musica     35       38
## 15   Marcia    F    16    174   60      4    preto ciclismo     38       38
## 3     Aurea    F    15    163   61      0    loiro ciclismo     36       42
## 16    Mauro    M    15    168   59      3    loiro   musica     39       40
## 5     Carla    F    14    168   60      1    loiro basquete     27       40
##    desempenhomat
## 7   insuficiente
## 8          otimo
## 9          otimo
## 19       regular
## 1          otimo
## 11           bom
## 17           bom
## 18         otimo
## 6            bom
## 10       regular
## 12           bom
## 20           bom
## 13           bom
## 2            bom
## 4          otimo
## 14           bom
## 15       regular
## 3   insuficiente
## 16  insuficiente
## 5        regular

Outra função que pode ajudar, caso se deseje verificar quais casos estão cumprindo certos critérios, é a função table. Principalmente para fazermos tabelas cruzando duas ou mais variáveis.

table(dante$desempenhomat, dante$sexo)
##               
##                F M
##   bom          5 3
##   insuficiente 1 2
##   otimo        3 2
##   regular      4 0

Uma outra função que pode, eventualmente, ajudar a veririficar quantos casos(individuos) estão em cada subconjunto é a função summary.

summary(dante)
##      nome               sexo               idade           altura     
##  Length:20          Length:20          Min.   :14.00   Min.   :159.0  
##  Class :character   Class :character   1st Qu.:16.00   1st Qu.:164.0  
##  Mode  :character   Mode  :character   Median :18.50   Median :168.5  
##                                        Mean   :20.05   Mean   :168.2  
##                                        3rd Qu.:22.00   3rd Qu.:172.2  
##                                        Max.   :34.00   Max.   :177.0  
##       peso           irmaos       cabelo             hobby          
##  Min.   :56.00   Min.   :0.0   Length:20          Length:20         
##  1st Qu.:59.00   1st Qu.:1.0   Class :character   Class :character  
##  Median :61.00   Median :1.5   Mode  :character   Mode  :character  
##  Mean   :63.85   Mean   :1.5                                        
##  3rd Qu.:66.25   3rd Qu.:2.0                                        
##  Max.   :83.00   Max.   :4.0                                        
##      sapato         manequim    desempenhomat     
##  Min.   :27.00   Min.   :36.0   Length:20         
##  1st Qu.:36.00   1st Qu.:38.0   Class :character  
##  Median :38.00   Median :40.0   Mode  :character  
##  Mean   :37.15   Mean   :39.9                     
##  3rd Qu.:39.00   3rd Qu.:42.0                     
##  Max.   :41.00   Max.   :46.0

Especifiamente, caso seja necessário calcular estatisticas por variável mas divididas por subgrupos podemos empregar o comando tapply. Contudo observe que a função indicada para ser aplicada precisa estar adequada ao tipo de dado que consta da varíavel em análise.

tapply(dante$idade, dante$sexo, mean)
##        F        M 
## 19.84615 20.42857

Ou então:

tapply(dante$desempenhomat, dante$sexo, summary)
## $F
##    Length     Class      Mode 
##        13 character character 
## 
## $M
##    Length     Class      Mode 
##         7 character character

Referências

BECHER, E. L.; MACHADO, L. B. Conhecendo o software R e suas possibilidades para o ensino de Estatística. In.: Anais do XIII Encontro Gaúcho de Educação Matemática. Santa Maria, 2018.