Introdução ao R e R Studio

Objetivos de aprendizagem

  1. Apresentar ao aluno o software estatísticos Rstudio, R e os pacotes do R.
  2. Desenvolver a noção de variáveis seus tipos
  3. Desenvolver a noção de objetos, vetores e data frames no R.
  4. Desenvolver a noção da operações aritiméticas e operações lógicas.
  5. Capacitar o aluno a usar os comandos básicos de um linguagem de estatística no R e Rstudio.
  6. Capacitar o aluno a criar funções simples no R.
  7. Capacitar o aluno a usar os comandos de do R para leitura de arquivos de dados.
  8. Capacitar o aluno a acessar os dados de um data frame.

Podemos inserir essas constantes em cáclulos como se fosse números, da mesma forma que podemos inserir variáveis nos cálculos. Vamos criar algumas variáveis no R e testar alguns cálculos. No R cada variável criada é um objeto. Veremos como criar variáveis (objetos) na próxima seção.

Introdução

A estatística é uma das áreas fundamentais das ciências da saúde. Em um dos primeiros artigos sobre o ensino da estatística para estudantes de medicina, num editorial do British Medical Journal de 1937, Bradford Hill já salientava que para poder ler de forma crítica a literatura científica o médico precisava dominar os conceitos estatísticos (Hill, 1965). Entretanto, o ensino da estatística só se tornou compulsório nas escolas médicas de Londres a partir de 1975 e em muitos países europeus apenas dez anos mais tarde (Altman e Bland, 1991). Nas últimas duas décadas a Organização Mundial de Saúde tem buscado estratégias para melhorar o ensino da estatística para os profissionais de saúde, tendo em vista que essas habilidades são úteis não apenas para aqueles que desejam se tornar pesquisadores, mas para todos que trabalham com a saúde, pois favorecem o pensamento crítico, lógico e científico, facilitando os processos de tomada de decisão, de análise de riscos e de avaliação das evidências científicas (Lwanga et al., 1999). A falta do conhecimento estatístico coloca em risco todo o projeto de uma prática baseada em evidências, cujo ponto fundamental é justamente a capacidade de uma leitura crítica da literatura científica (Sackett e Rosenberg, 1995). A importância desse conhecimento se torna ainda mais relevante quando levamos em conta a imensa quantidade de erros estatísticos básicos na literatura médica (Altman e Bland, 1991) e baixa qualidade da literatura científica que, infelizmente, é muito menos confiável do que nossa intuição imagina. Em um dos artigos mais citados de 2005, Ioannidis alerta que cerca de metade dos resultados da literatura científica médica não são verdadeiros (Ioannidis, 2005) e, mais recentemente, que a maioria dos estudos clínicos não são úteis (Ioannidis, 2016). Ou seja, não apenas a maioria dos resultados são falsos, como a maioria dos resultados verdadeiros não são úteis (Ioannidis, 2016). O médico, consumidor principal dessa literatura, precisa mais do que nunca saber analisar de forma crítica esses artigos e, para tanto, a formação sólida em métodos estatísticos é de suma importância.

Entretanto, existem barreiras reais ao ensino da estatística para estudantes das áreas da saúde. A mera menção da palavra “estatística” é suficiente para evocar fortes reações emocionais de rejeição na maioria das pessoas (Hill, 1947). Estudantes de medicina muitas vezes preferem evitar disciplinas com conteúdo matemático e, via de regra, os cursos de estatística ou bioestatística não são muito populares entre esses alunos (Altman e Bland, 1991). Além disso, alunos das áreas de saúde usualmente tem dificuldade em perceber a importância dessa disciplina, não veem razão para estudar metodologia da pesquisa científica e não se sentem motivados para aprender os difíceis conceitos matemáticos fundamentais (Clarke et al., 1980; Altman e Bland, 1991). Essas barreiras podem comprometer seriamente o aprendizado da estatística pelos estudantes de medicina e, como resultado disso, fazer com que muitos médicos sejam incapazes de uma leitura crítica da literatura científica.

A Linguagem Estatística R

A performance do aprendizado de um estudante está diretamente relacionada a diversos fatores, tais como o seu grau de engajamento, ao prazer em estudar o conteúdo, ao seu sentimento de confiança na capacidade de aprender, a sua determinação para aprender. Assim, devem ser buscados mecanismos que possibilitem aumentar esses fatores. Um desses fatores é o uso de softwares estatísticos adequados.

O uso de um software em cursos introdutórios de estatística deve levar em consideração uma série de fatores: disponibilidade, custo, facilidade de uso, possibilidade de geração de gráficos e imagens, facilidade de acesso a literatura sobre o software, documentação do software, disponibilidades de pacotes auxiliares, utilidade futura do software na vida acadêmica.

A linguagem estatística R associada à interface RStudio preenchem da melhor forma possível os requisitos necessários para essa função. O R é o produto de uma colaboração entre estatísticos para criação de um ambiente computacional poderoso, programável, portátil e aberto, aplicável aos problemas mais complexos e sofisticados, bem como análises “rotineiras”, sem restrições de acesso ou uso. O R é uma linguagem de código aberto e livre, publicado sob a licença pública GNU, mantido pela R Foundation. É executável em diversos sistemas operacionais (macOS, Windows, Linux), tendo uma imensa gama de pacotes que permitem análises estatísticas e visualizações de grande sofisticação. Nos últimos anos o uso do R como ferramenta para aulas de estatísticas cresceu muito e surgiram vários pacotes específicos para uso como ferramentas de ensino da estatística, tais como o mosaic, Teachingdemos, simpleR, uwIntroStats. Foram lançados nos últimos anos diversos livros textos introdutórios de estatística baseados no uso do R: Introductory Statistics with R, Discovering Statistics Using R, Learn Statistics Using R, An R Introduction to Statistics, Introduction to probability and Statistics Using R, OpenIntro Statistics e diversos outros manuais introdutórios disponíveis livremente na internet. Em 2014, durante o New England Statistics Symposium, foi lançado o site StatsTeachR, um site open-access, repositório de módulos de ensino da estatística usando o R. O R possui uma rica documentação, inúmeros tutoriais gratuitos disponíveis na internet, uma grande e crescente comunidade de suporte. Recentes levantamentos têm revelado que o uso do R tem crescido vertiginosamente nas últimas décadas, sendo atualmente o software estatístico mais usado e com maior projeção de crescimento. Apesar de parecer um software apropriado, é importante investigar se o seu uso em aulas práticas de ensino da estatística na graduação em medicina modifica a atitude do estudante em relação a este assunto e se a aceitação da incorporação dessa tecnologia interfere na modificação da atitude dos estudantes.

História

A origem do R é a Linguagem S desenvolvida por John Chambers em 1976, enquanto trabalhana nos laboratórios da empresa de telefonia AT&T Bell Labs. No início da década de 90, a linguagem S foi incrementada com uma notação para modelos estatísticos, resultado numa significativa economia de esforço de programação para análise estatística de dados. No final da década de 90 o S foi revisado e se tornou uma linguagem de alto padrão totalmente baseada em programação por objetos. Essa é versão atual da linguagem S, que deu origem ao R.

A linguagem e o ambiente R foram desenvolvidos no final da década de 90 início dos anos 2000. Sua estrutura de código aberto e de software público e gratuito atraiu um grande número de desenvolvedores. A popularidade do R tem crescido ininterruptamente, principalmente nos últimos 5 anos (Robinson, 2017). Atualmente o R é um dos principais softwares estatísticos usados em pesquisas acadêmicas, principalmente em pesquisas na área médica, pois o R é “a ferramente de escolha para muitos métodos estatísticos necessários nos estudos clínicos” (Robinson, 2017). O R é atualmente o principal repositório de funções estatísticas validadas (Revolutions, 2017b).

“R has really become the second language for people coming out of grad school now, and there’s an amazing amount of code being written for it,” said Max Kuhn, associate director of nonclinical statistics at Pfizer (Vance, 2009).

Timeline

1993: Research project in Auckland, NZ
1995: R Released as open-source software
1997: R core group formed
2000: R 1.0.0 released (February 29)
2003: R Foundation founded
2004: First international user conference in Vienna
2015: R Consortium founded
(fonte: http://blog.revolutionanalytics.com/2016/03/16-years-of-r-history.html)

Comprehensive R Archive Network, CRAN.

O CRAN (Comprehensive R Archive Network) é um repositório onde qualquer pessoa pode contribuir com uma extensão para R (chamadas de “pacote” - packages), desde que atenda aos requisitos de qualidade e licenciamento estabelecidos pelos mantenedores do CRAN.

Em janeiro de 2017, graças à comunidade extremamente ativa de desenvolvedores que contribuem para o R diariamente, o CRAN atingiu a marca de 10.000 pacotes disponíveis para download (Revolutions, 2017a).

Número de pacotes no site do CRAN (fonte: http://blog.revolutionanalytics.com/2016/03/16-years-of-r-history.html)

Popularidade do R

O R tem se tornado cada vez mais popular na pesquisa científica. Em 2009 o New York Times publicou uma reportagem acerca da popularidade o R entre os cientistas. Segundo o New York Times, o R tem se tornado a segunda língua dos pesquisadores.

http://www.nytimes.com/2009/01/07/technology/business-computing/07program.html?pagewanted=all New York Times article

Numa pesquisa realizada em 2015 pela Rexer Analytics Survey o R foi o mais usado entre 1220 cientistas avaliados.

Analytics tools used by respondents to the 2015 Rexer Analytics Survey Muitas empresas usam o R para suas análises estatísticas.

Empresas que usam o R

Empresas que usam o R

Introdução ao RStudio

RStudio é um IDE (Integrated Development Enviroment), ou seja, um Ambiente de Desenvolvimento Integrado para uso da linguagem estatística R. Um IDE é um software com ferramentas de apoio ao desenvolvimento do trabalho e facilita incrivelmente trabalhar com o R. O RStudio foi lançado ao público em 2008 e já conta hoje com um grande número de usuários. Atualmente o Rstudio ’é usado pela NASA, Eli Lilly, AstraZeneca, Samsung, Honda, Hyunday, Walmart, Nestle, General Eletric, Santander, Universidade de Oxford, Universidade de Toronto e inúmeras outras instituições.

A versão gratuita do Rstudio é perfeitamente adequada para os usos acadêmicos, tornando totalmente dispensável o uso de softwares pagos e com custo elevado.

Os objetos do R

O R é uma linguagem de programação de alto nível e como tal, usa do conceito de objetos. As linguagens de programação desse tipo são chamadas de linguagens orientadas a objetos. Essa abstração simplifica muito a programação e torna muito mais fácil resolver problemas complexos.

Os resultados de operações podem ser armazenados em variáveis, que no R são chamados de Objetos. O operador para colocar algo num objeto é uma seta para esquerda, formada pelo sinal de menor seguida do sinal de menos <-. Isso forma uma seta, indicando que o resultado da operação será colocado no objeto à esquerda da seta.

Nomes

Existem algumas regras para nomear objetos no R. 1. Os nomes dos objetos devem sempre começar com uma LETRA.
2. Nomes podem conter LETRAS, NÚMEROS e o underscore _.
3. O R é case sensitive, ou seja, interpreta de forma diferente as letras maiúsculas e minúsculas. Portanto, uma variável chamada raio é diferente de Raio. Cuidado ao digitar maiúsculas.
4. Use nomes que sejam descritivos, ou seja, que facilitem a interpretação do significado. 5. Existem vários estilos de nomeação de variáveis, escolha um e se mantenha consistente ao londo do seu trabalho.

Estilos de nomeação de objetos
1. camelCase - usado para nomear funções 2. period.naming - usado para nomear objetos (variávei) 3. snake_case - deve ser evitado, por motivos estéticos

vejamos alguns exemplos de variáveis e de atribuição da valor a variáveis (objetos)

nome.prof      <- "Henrique"                        # nome do professor
ano           <- as.integer(2017)                  # ano atual
idade         <- 45                                # idade do professor
peso          <- 69.5                              # peso do professor
altura        <- 1.75                              # altura do professor
IMC           <- peso / (altura^2)                 # calculo do IMC
sobrepeso     <- IMC > 25 & IMC <= 30              # operação lógica
obesidade     <- IMC > 30

Para visualisar o objeto basta digitar seu nome no console:

nome.prof
## [1] "Henrique"
ano
## [1] 2017
idade
## [1] 45
peso
## [1] 69.5
altura
## [1] 1.75
IMC
## [1] 22.69388
sobrepeso
## [1] FALSE
obesidade
## [1] FALSE

Para verificarmos a classe do objeto usamos a função class()

class(nome.prof)
## [1] "character"
class(ano)
## [1] "integer"
class(idade)
## [1] "numeric"
class(peso)
## [1] "numeric"
class(altura)
## [1] "numeric"
class(IMC)
## [1] "numeric"
class(sobrepeso)
## [1] "logical"
class(obesidade)
## [1] "logical"

Vamos analisar cada tipo de objeto criado acima:
O objeto nome.prof é um objeto tipo char, ou seja, composto de caracteres.
O objeto ano foi forçada a ser variável inteira o comando as.integer().
Os objetos idade, peso e altura e IMC são variáveis numéricas. Veja que as variáveis sobrepeso e obesidade são variáveis lógicas, resultados de operações lógicas.

Vamos verificar a estrutura de cada uma dessas variáveis usando a função str().

str(nome.prof)
##  chr "Henrique"
str(ano)
##  int 2017
str(idade)
##  num 45
str(peso)
##  num 69.5
str(altura)
##  num 1.75
str(IMC)
##  num 22.7
str(sobrepeso)
##  logi FALSE
str(obesidade)
##  logi FALSE

A calculadora do R: Operações aritiméticas e lógicas

Operações lógicas

Toda linguagem de programação possui também variáveis do tipo lógica, também chamada de Booleana, em homenagem ao matemático George Boole, que definiu um sistema de lógica metade do século XIX.

Uma variável lógica só pode assumir dois valores, 1 ou 0, ou TRUE ou FALSE. Algumas vezes as variáveis lógicas são resultado de uma simples atribuição, tal como z <- FALSE, mas na maioria das vezes essas variáveis são resultado de operações lógicas. Assim como operações aritiméticas são ralizadas com operadores aritiméticos, operações lógicas são realizadas com operadores lógicos. Como toda linguagem matemática, o R possui, além dos operadores aritméticos, operadores lógicos:

Operador Descrição
< menor que …
<= menor ou igual a …
> maior que …
>= maior ou igual a …
== extamente igual a …
! não / negação
!= não igual ou diferente de …
| OR
& AND

Vamos testar alguns exemplos:

teste1 <- (4 == 5) # a operação 4==5 é uma operação lógica, cujo resultado é FALSO
teste2 <- TRUE     # a variável teste 2 recebeu o valor TRUE por atribuição.
teste3 <- (4 == 5) | (4 == 4)   # usando o operador | -> se qualquer uma das condições for verdadeira o resultado é verdadeiro
teste4 <- (4 == 5) & (4 == 4)   # usando o operador & -> só se ambas as condições forem verdadeiras é que o resultado é verdadeiro

A operação 4==5 é uma operação lógica, cujo resultado é FALSO.
O resultado dessa operação, FALSO, foi atribuido a variável teste1.
Logo, teste1 é uma variável lógica e seu valor é FALSO.
A variável teste2 é também uma variável lógica, mas recebeu o valor TRUE por atribuição. A variável teste3 recebe o valor de tres operações lógicas. Perceba que o operador | significa OU, isto é, se uma das operações antes ou depois do operador for verdadeira o resultado final será TRUE, ainda que a outra operação seja falsa.
Para ver o valor dessas variáveis basta digitar teste1, teste2, teste3 e teste4 no console.

teste1
## [1] FALSE
teste2
## [1] TRUE
teste3
## [1] TRUE
teste4
## [1] FALSE

Operações lógicas

O console do R pode ser usado como uma calculadora para operações aritiméticas. Experimente fazer cálculos no console usando as operações abaixo:

operador aritmético função exemplo de uso
+ soma 5 + 3
- subtração 5 - 3
* multiplicação 5 * 3
/ divisão 5 / 3
sqrt() raiz quadrada sqrt(5)
^ potencia 5^2
exp() exponencial e exp(5)
log() logaritmo natural log(5)
log10() logaritmo base 10 log10(5)
log2() logaritimo base 2 log2(5)
factorial() fatorial factorial(5)
5 + 3
## [1] 8
5 - 3
## [1] 2
5 * 3
## [1] 15
5 / 3
## [1] 1.666667
sqrt(5)
## [1] 2.236068
5^2
## [1] 25
exp(5)
## [1] 148.4132
log(5)
## [1] 1.609438
log10(5)
## [1] 0.69897
log2(5)
## [1] 2.321928
factorial(5)
## [1] 120

Operações matemáticas podem ser também usadas em conjunto, separando a ordem das operações com parenteses:

1/(sqrt(125-25))
## [1] 0.1

Exemplo de cálculo da área e raio de uma circunferência no R:

raio <- 10                 # atribui um valor ao objeto raio
area <- pi*(raio^2)        # veja que o R possui várias constantes matemáticas predefinidas, inclusive pi
perimetro <- 2*pi*raio     

Os código acima fez o seguinte:
1. Armazenou no objeto raio o número 3
2. Armazenou no objeto area o resultado da operação \(\pi \times (raio^2)\)
3. Armazenou no objeto perimetro o resultado da operação \(2 \times \pi \times raio\)

Para que o R mostre o conteúdo de um objeto, basta digitar o nome do objeto no console:

raio
## [1] 10
area
## [1] 314.1593
perimetro
## [1] 62.83185

Veja que algumas operações acima são funções matemáticas e foi necessário inserir entre parênteses o valor que desejamos que fosse computado, tal como e sqrt(5), exp(5), log(5) e etc.
Em linguagem computacional o valor que é inserido numa função recebe o nome de argumento da função. Uma função pode receber um ou mais argumentos, e esses argumentos serão usados para realizar alguma operação. Podemos fazer uma função para calcular o raio de um círculo e usar essa função sempre que precisarmos. vamos ver como fazer isso.

Funções no R

O R nos permite também construirmos quaisquer funções matemáticas que desejarmos Toda função recebe como argumentos valores ou dados inseridos entre parenteses.
Os argumentos de uma função é que serão usados pela função em algum cálculo. Faremos uma função para calcular a área de um círculo, o argumento natural dessa função é o raio do círculo.

\[ area = \pi \times r^2 \]

para criar uma função simplesmente atribuimos a um objeto a função desejada. Usamos para isso o operador <- seguido da palavra function (). Entre o parenteses colocamos os argumentos da função e em seguida um colchetes para dar início à função:

      nome_da_função `<-` `function(argumento1, argumento2)` { corpo da função }
      

Podemos também incluir valores default para os argumentos, ou seja, valores que serão usados caso a função seja chamada sem que o argumento tenha sido incluido.

circleArea <- function (raio=1){ # cabeçalho da função com colchetes indicando o início da função
area <- pi*(raio^2)            # corpo da função onde são executadas as operações
}                              # colchetes finalizando a função

Agora, depois de criada a função, podemos simplesmente calcular a área de um circulo usando a função criada usando a função criada e inserindo entre parenteses o valor desejado como argumento. Por exemplo para obtermos a área de um circulo de raio 10 basta digitar circleArea(10). Vamos fazer isso e armazenar o resultado na variável area e verifique que o resultado foi o mesmo obtido acima no cálculo “manual”.

area.1 <- circleArea(10)
area.1
## [1] 314.1593

O que acha que ocorreria se a função acima circleArea() fosse chamada sem argumentos? Experimente para ver

area.2 <- circleArea()  # função area chamada sem argumentos
area.2

Texto no R

Além de números os objetos no R podem conter caracteres, palavras ou até frases. Basta usar o operador de atribuição <- e o texto entre aspas. Vamos escrever o texto “Amo usar o RStudio” e atribuir esse texto a uma variável (objeto) chamado de sentimento.

sentimento <- "Eu amo usar o RStudio"

Para verificar o conteúdo do objeto sentimento basta digitar o objeto no console:

sentimento
## [1] "Eu amo usar o RStudio"

Vetores, a base do R

No R todo objeto é um vetor. O vetor é a base do R. Um vetor é simplesmente um conjunto de objetos do mesmo tipo. Ou seja, um vetor pode ser um conjunto de números inteiros, ou um conjunto de números reais, ou um conjunto de caracteres, ou um conjunto de palavras etc.

O comando para construir um vetor no R é simplesmente a letra c, que significa combine. Vamos criar diferentes vetores para testar como isso funciona.

nome       <- c("Henrique", "Leo", "Gustavo", "Antônio", "Fabiano", "Rodrigo")
idade      <- c(45, 28, 50, 32, 30, NA)
prof       <- c("Médico", "Médico", "Médico", "Biólogo", "Médico", "Médico")
casado     <- c(TRUE, FALSE, TRUE, TRUE, NA, TRUE)
disciplina <- c("Métodos Científicos", "Sistemas Orgânicos Integrados", "Habilidades Médicas", "Sistemas Orgânicos Integrados", "Sistemas Orgânicos Integrados", "Imagem" )
especialidade <- c("Psiquiatra", "Anatomista", "Cirurgião", NA, "Cardiologista", "Hematologista")
formatura  <- c(1997, 2015, 1991, 2006, 2012, 1992)

nome
## [1] "Henrique" "Leo"      "Gustavo"  "Antônio"  "Fabiano"  "Rodrigo"
idade
## [1] 45 28 50 32 30 NA
prof
## [1] "Médico"  "Médico"  "Médico"  "Biólogo" "Médico"  "Médico"
casado
## [1]  TRUE FALSE  TRUE  TRUE    NA  TRUE
disciplina
## [1] "Métodos Científicos"           "Sistemas Orgânicos Integrados"
## [3] "Habilidades Médicas"           "Sistemas Orgânicos Integrados"
## [5] "Sistemas Orgânicos Integrados" "Imagem"
especialidade
## [1] "Psiquiatra"    "Anatomista"    "Cirurgião"     NA             
## [5] "Cardiologista" "Hematologista"
formatura
## [1] 1997 2015 1991 2006 2012 1992

Vamos verifica a classe de cada uma desses objetos

class(nome)
## [1] "character"
class(idade)
## [1] "numeric"
class(prof)
## [1] "character"
class(casado)
## [1] "logical"
class(disciplina)
## [1] "character"
class(especialidade)
## [1] "character"

Perceba que alguns dos valores são NA. Em linguagem computacional NA significa que aquele dado não é conhecido. É muito comum que, por exemplo, uma pessoa deixe de responder uma questão num questionário. Esse campo ficou vazio. NA pode ser entendido como Not Available. É importante saber da existencia de valores NA, pois quando são feitos cálculos em vetores com NA é importante informar ao R que esses valores devem ser desconsiderados. Veremos como fazer isso em breve.

Data Frames, o coração do R

Se os vetores são a base o R, os data.frames são o coração do R. O data.frame é a forma mais usual de armazenar dados no R e, se usada sistematicamente, facilita enormemente a análise de dados. a palavra data frame pode ser traduzida grosseiramente por quadro de dados, mas

O conceito de um quadro de dados vem do mundo do software estatístico usado na pesquisa empírica; Geralmente refere-se a dados “tabulares”: uma estrutura de dados que representa casos (linhas), cada um dos quais consiste em um número de observações ou medições (colunas). Alternativamente, cada linha pode ser tratada como uma observação única de múltiplas “variáveis”. Em qualquer caso, cada linha e cada coluna tem o mesmo tipo de dados, mas o tipo de dados de linha (“registro”) pode ser heterogêneo (uma tupla de tipos diferentes), enquanto o tipo de dados da coluna deve ser homogêneo. Os quadros de dados geralmente contêm alguns metadados além dos dados; Por exemplo, nomes de colunas e linhas.

Data frame é um tipo de objeto com estrutura bidimensional, composto de linhas e colunas, tais como uma matriz de dados. Uma importante qualidade de um data frame é suas diferentes colunas pode conter diferentes tipos de vetor. Mas cada os elementos de uma mesma coluna devem ser todos do mesmo tipo.

A forma ideal de um data.frame é chamada de tidy. tidy, segundo o dicionário Cambridge significa “having everything ordered and arranged in the right place”. Ou seja, um data frame na forma tidy significa que os dados estão organizados, mas mais do que isso, que estão organizados de uma forma padronizada que facilita a análise. Um data.frame na forma tidy contém as diferentes variáveis nas colunas e as diferentes observações nas linhas. Veja abaixo um diagrama de Hadley Wickham acerca de um data frame no formato tidy (http://r4ds.had.co.nz/tidy-data.html)

Tidy data frame

Tidy data frame

Vamos criar um data.frame da forma tidy com os vetores que já temos:

prof.IPTAN <- data.frame(nome, idade, prof, casado, disciplina, especialidade, formatura)
prof.IPTAN
class(prof.IPTAN)
## [1] "data.frame"
str(prof.IPTAN)
## 'data.frame':    6 obs. of  7 variables:
##  $ nome         : Factor w/ 6 levels "Antônio","Fabiano",..: 4 5 3 1 2 6
##  $ idade        : num  45 28 50 32 30 NA
##  $ prof         : Factor w/ 2 levels "Biólogo","Médico": 2 2 2 1 2 2
##  $ casado       : logi  TRUE FALSE TRUE TRUE NA TRUE
##  $ disciplina   : Factor w/ 4 levels "Habilidades Médicas",..: 3 4 1 4 4 2
##  $ especialidade: Factor w/ 5 levels "Anatomista","Cardiologista",..: 5 1 3 NA 2 4
##  $ formatura    : num  1997 2015 1991 2006 2012 ...

Acessando as variáveis de um data.frame (trabalhando com as colunas)

Como foi exposto, um data.frame na forma tidy tem em cada coluna uma variável e em cada linha as diferentes observações. Então, se selecionarmos uma coluna, os valores dessa coluna serão as diferentes observações dessa variável. Desse modo, poderemos fazer vários cálculos estatísticos nessas observações, como por exemplo, calcular a média, mediana, etc.

Para selecionarmos uma coluna específica num data.frame usamos o sinal $.
A forma de usar esse operador é a seguinte: nome_do_data_frame$nome_da_coluna

Exemplo: para selecionar a coluna com as idades dos professores: prof.IPTAN$idade. Experimente fazer isso com todas as colunas e veja que o resultado é um vetor com os dados daquela coluna.

prof.IPTAN$idade
## [1] 45 28 50 32 30 NA

Para calcular qualquer medida estatística basta inserir prof.IPTAN$idade como argumento da função desejada:

mean(prof.IPTAN$idade) # media da idade dos professores
## [1] NA

Ops! a média não foi calculada. O resultado da operação foi NA. Isso ocorreu porque um dos valores da idade não está disponível. Verifique que a idade do professor Carlos Antônio está registrada no data.frame como NA. A sigla NA significa NOT AVAILABLE, ou seja, um valor que apesar de existir não está disponível. É extremamente comum que data.frames contenham valores NA. Portanto, sempre que for realizado um cálculo em colunas de um data frame é importante informar ao R que esse valores devem ser desconsiderados. Isso é feito com o argumento na.rm=TRUE, que é uma forma resumida de escrever NA remova = SIM.

mean(prof.IPTAN$idade, na.rm = TRUE) # media da idade dos professores, removendo os valores NA
## [1] 37

Selecionando variáveis (colunas) de um data.frame

O pacote {dplyr} possui uma função bastante útil chamada select(). Essa função nos permite selecionar as variáves que nos interessam. Quando trabalhamos com grandes data.frames essa função nos ajuda a criar um data.frame apenas com as variáveis que interessam. Se desejarmos saber apenas os nomes e idades dos professores, podemos usar a função select para criar um novo data.frame apenas com essa observações. Para isso basta colocar como primeiro argumento o nome do data.frame a ser trabalhado e, em seguida, as colunas que deseja manter:

# criando um novo data.frame apenas com as variáveis nome e idade
prof.IPTAN.2 <- select(prof.IPTAN, nome, idade)
prof.IPTAN.2 

A função select é bastante versátil. Podemos também criar um novo data.frame apenas especificando a variável que desejamos eliminar. Para isso basta usar o sinal de - antes do nome da variável:

# criando um novo data.frame com todas as variáveis, exceto o estado civil e a disciplina
prof.IPTAN.3 <- select(prof.IPTAN, -casado, -disciplina)
prof.IPTAN.3 

Criando novas variáveis (colunas) com a função mutate

Podemos criar novas variáveis a partir daquelas disponíveis no data.frame com a função mutate(). Para isso basta incluir como argumento da função o nome do data.frame, seguido do nome das novas variáveis e a fórmula para criação dessas novas variáveis. Por exemplo, podemos calcular há quanto tempo os professores estão formados. Para isso basta subtrair o ano atual do ano de formatura.

# calculando o ano atual
ano.atual <- 1900 + (as.POSIXlt(Sys.time())$year) # não tente entender esse cálculo !!!

prof.IPTAN.3 <- mutate(prof.IPTAN, tempoFormado = ano.atual - formatura)
prof.IPTAN.3

Filtrando as observações (linhas) de um data.frame com

As linhas de um data frame representam as diferentes observações Veja que no data.frame de exemplo acima cada linha representa um professor. Em trabalhos na área de saúde representam, na maioria das vezes, os diferentes participantes.

Frequentemente precisamos acessar subgrupos desse grande conjunto de participantes, ou seja, precisamos selecionar subgrupos nos quais desejamos fazer nossa análise. Isso é feito no R com a função subset() ou a função filter() do pacote {dplyr}. Ambas as funções fazem o mesmo trabalho, mas filter() é mais sofisiticado em alguns aspectos e por isso sugiro o uso dessa função. Além disso como o pacote {dplyr} é extremamente importante para trabalhar com dados, é mais consistente usar sempre as funções desse pacote.

O mode de usar é muito simples, o primeiro argumento é o data.frame a ser usado, em seguida as expressões lógicas para filtrar/selecionar as linhas do data.frame.

Vamos criar um subgrupo em nosso data.frame dos professores do IPTAN selecionando apenas aqueles da disciplina “Sistemas Orgânicos Integrados” e calcular a média de idade desses professores usando as duas funções como exemplo

# exemplo usando subset()
prof.SOIa <- subset(prof.IPTAN, disciplina == "Sistemas Orgânicos Integrados")

# exemplo usando filter()
prof.SOIb <- filter(prof.IPTAN, disciplina == "Sistemas Orgânicos Integrados")

# Resultado de ambas as operações 
mean(prof.SOIa$idade, na.rm = TRUE)
## [1] 30
mean(prof.SOIb$idade, na.rm = TRUE)
## [1] 30

Lendo arquivos de dados

Todas análises estatísticas dependem de um conjunto de dados que, idealmente, irão ser carregados no R na forma de um data.frame, preferencialmente na forma tidy, como explicado acima. Você já aprendeu também como trabalhar com as linhas e colunas de um data.frame usando a função subset() e o os operadores $. Mas até agora trabalhamos com um data.frame criado manualmente. Todas linhas e colunas do data.frame dos professores foram digitadas uma a uma no R. Na vida real iremos trabalhar com datasets muito maiores, que precisaram ser lidos e carregados para o ambiente de trabalho do R.

Precisamos agora aprender como ler os dados e carregar esses dados para o R na forma de um data.frame.

A etapa inicial de qualquer análise de dados é carregar esses dados para um objeto no Rstudio, ou seja, para uma variável que irá então conter esses dados. Para isso, supoe-se que você já disponha de um arquivo com esses dados. Existem diversos formatos de arquivos, cada um apropriado para ser lido por um aplicativo apropriado. Vejamos:

formato Tipo de dados software para ler os dados
.txt texto Qualquer leitor de texto
.doc texto Word (microsoft)
.docx texto Word (microsoft)
.xls planilha Excel (microsoft)
.ppt slides PowerPoint (microsoft)
.pdf documento portátil Qualquer leitor de PDF (ex: Acrobat)
.pages texto Pages (Apple)
.numbers planilha Numbers (Apple)
.key slides Keynote (Apple)
.csv dados Qualquer leitor de texto

Alguns formatos de arquivos dependem de um software específico para sua leitura. Outros formatos são menos expecíficos, podendo ser lidos por um grande número de softwares, como é o caso dos arquivos .txte dos arquivos .pdf. Esses formatos são mais universais, sendo padrões comuns para comunicação de informações textuais.

Quando essa troca de dados se refere não um texto propriamente dito, mas um conjunto de dados, tais como tabelas com dados, um dos formatos mais universais é o .csv (comma separated values = valores separados por virgulas).

A estrutura desse arquivo é bastante simples: existem várias linhas, cada linha com vários dados, separados por vírgulas. Existem, entretanto variações nesse formato, por exemplo, no Brasil as casas decimais são separadas por vírgulas, nesse caso o delimitador dos valores não poderia ser a vírgula e é usado então o ponto e vírgula. Ao ler dados no formato .csv é sempre importante informar se os dados são separados por , ou ; e se o separador do decimal é a virgula , ou o ponto final .. Caso contrário a leitura dos dados poderá ser corrompida.

A leitura de dados no formato .csv no RStudio é feita com o comando read.table().
Esse comando tem como argumentos:

argumentos valor default valor que necessita ser ajustado
file = não possui “nome do arquivo a ser lido.csv”
na.strings NA trocar para o que estiver sendo usado no arquivo
header FALSE trocar para TRUE se houver cabeçalho no arquivo
sep espaço trocar para "," ou ";" conforme o usado no arquivo
dec “.” usar o default ou trocar por "," se for o caso

No caso do arquivo usado nesse exercício:
há um cabeçalho (header= TRUE)
os valores estão separadads por vírgula (sep = ",")
o separador decimal é o ponto final (dec = ".")

Vamos testar essas funções lendo dados no formato .csv com a função read.table().

Para esse exercício será lido o arquivo “FSMA_Anthropometric_data.csv”.

Esses dados foram coletados nos EUA pela “Consumer Product Safety Commission (CPSC)” e incluem medidas antropometricas de 4.000 partcipantes, crianças e adultos. O dataset completo está disponível no site:
http://math.nist.gov/~SRessler/anthrokids/

Variáveis do dataset:

Number (id do participante) weight (newtons) stature (mm) head_circumference (mm) chest_circumference (mm) waist_circumference (mm) shoulder_breadth (mm) hand_length (mm) hand_breadth (mm) foot_length (mm) foot_breadth (mm) gender ( 1 = male, 2 = female) age_months (months))

Para leitura de arquivo vamos inicialmente usar uma função base do R, read.table(), informando que:
1. os valores NA estão representados por “NA” na.strings = NA
2. há um cabeçalho header = TRUE
3. os valores são separados por um ponto e virgula sep = ";"
4. que o decimal é o ponto final dec = "."

humanSizes <- read.table(file="FSMA_Anthropometric_data.csv", 
                         na.strings = "NA",
                         header = TRUE,
                         sep = ";",
                         dec = ".")

Podemos também ler um arquivo .csv usando as funções do pacote {readr}, que faz parte do {tidyverse}.
Nesse pacote existem várias funções mais sofisticadas para leitura de dados, entre elas o read_csv() e o read_csv2().
A diferença entre essas funções é que o read_csv() lê arquivos separados por vírgula , enquanto o read_csv2() lê arquivos separados por ponto e vírgula ;.

Essas duas funções assumem como default a inexistência de um cabeçalho, logo, caso exista, será necessário informar através do argumento col_names = TRUE. O argumento para informar quais os símbolos para valores NA é o na =.

As funções de leitura de dados do pacote {readr} são mais rápidas e mais informativas, mostrando logo após a leitura dos dados que tipo de variável foi lida em cada coluna. Veja no exemplo a seguir a leitura dos mesmos dados antropometricos:

humanSizes2 <- read_csv2("FSMA_Anthropometric_data.csv", 
                          na = c("", "NA"),
                          col_names = TRUE)
## Using ',' as decimal and '.' as grouping mark. Use read_delim() for more control.
## Parsed with column specification:
## cols(
##   number = col_integer(),
##   weight = col_integer(),
##   stature = col_integer(),
##   head_circumference = col_integer(),
##   shoulder_breadth = col_integer(),
##   hand_length = col_integer(),
##   hand_breadth = col_integer(),
##   chest_circumference = col_integer(),
##   waist_circumference = col_integer(),
##   foot_length = col_integer(),
##   foot_breadth = col_integer(),
##   gender = col_integer(),
##   age_months = col_integer()
## )

Vamos checar os resultados obtidos através das duas funções de leitura dos dados:

str(humanSizes)
## 'data.frame':    3741 obs. of  13 variables:
##  $ number             : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ weight             : int  155 176 230 165 150 179 134 135 194 188 ...
##  $ stature            : int  1033 1039 1112 997 997 987 941 933 1164 1100 ...
##  $ head_circumference : int  498 506 512 489 473 513 507 490 529 524 ...
##  $ shoulder_breadth   : int  282 273 309 253 273 279 249 251 296 284 ...
##  $ hand_length        : int  120 121 121 116 114 114 101 109 125 123 ...
##  $ hand_breadth       : int  55 56 59 51 51 55 52 50 59 56 ...
##  $ chest_circumference: int  526 564 601 532 501 558 503 502 553 563 ...
##  $ waist_circumference: int  475 498 520 491 465 503 459 461 507 535 ...
##  $ foot_length        : int  163 163 171 163 167 164 150 150 175 172 ...
##  $ foot_breadth       : int  67 67 65 61 64 66 61 61 69 65 ...
##  $ gender             : int  2 1 2 2 2 1 1 2 2 2 ...
##  $ age_months         : int  50 51 53 46 41 44 40 43 66 62 ...
str(humanSizes2)
## Classes 'tbl_df', 'tbl' and 'data.frame':    3741 obs. of  13 variables:
##  $ number             : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ weight             : int  155 176 230 165 150 179 134 135 194 188 ...
##  $ stature            : int  1033 1039 1112 997 997 987 941 933 1164 1100 ...
##  $ head_circumference : int  498 506 512 489 473 513 507 490 529 524 ...
##  $ shoulder_breadth   : int  282 273 309 253 273 279 249 251 296 284 ...
##  $ hand_length        : int  120 121 121 116 114 114 101 109 125 123 ...
##  $ hand_breadth       : int  55 56 59 51 51 55 52 50 59 56 ...
##  $ chest_circumference: int  526 564 601 532 501 558 503 502 553 563 ...
##  $ waist_circumference: int  475 498 520 491 465 503 459 461 507 535 ...
##  $ foot_length        : int  163 163 171 163 167 164 150 150 175 172 ...
##  $ foot_breadth       : int  67 67 65 61 64 66 61 61 69 65 ...
##  $ gender             : int  2 1 2 2 2 1 1 2 2 2 ...
##  $ age_months         : int  50 51 53 46 41 44 40 43 66 62 ...
##  - attr(*, "spec")=List of 2
##   ..$ cols   :List of 13
##   .. ..$ number             : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ weight             : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ stature            : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ head_circumference : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ shoulder_breadth   : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ hand_length        : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ hand_breadth       : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ chest_circumference: list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ waist_circumference: list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ foot_length        : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ foot_breadth       : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ gender             : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   .. ..$ age_months         : list()
##   .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr  "collector_guess" "collector"
##   ..- attr(*, "class")= chr "col_spec"

Conclusão

Em breve, você estará acostumado a lidar com um data.frame com a mesma facilidade que usa a agenda de seu ceular.

Referências.

David Robinson. The Impressive Growth of R. October 10, 2017. Stackoverflow Blog. Disponível em: https://stackoverflow.blog/2017/10/10/impressive-growth-r/. Acessado em 07/01/2018.

Revolutions. CRAN now has 10,000 R packages. Here’s how to find the ones you need. Revolutions Analitics Blog. January 27, 2017. Disponível em: http://blog.revolutionanalytics.com/2017/01/cran-10000.html Acessado em 07/01/2018.

Revolutions. R’s remarkable growth. October 10, 2017. Disponível em:http://blog.revolutionanalytics.com/2017/10/rs-remarkable-growth.html. Acessado em 07/01/2018.

Ashlee Vance.Data Analysts Captivated by R’s Power. New York Times - Business Computing. January 6, 2009. Disponível em: http://www.nytimes.com/2009/01/07/technology/business-computing/07program.html?pagewanted=1. Acessado em: 07/01/2018.