R é um ambiente de programação voltado para manipulação, análise de dados e apresentação gráfica. R é um projeto que está em constante desenvolvimento resultado de um esforço colaborativo com contribuições de todo o mundo. Foi inicialmente escrito por Robert Gentleman e Ross Ihaka do Departamento de Estatística da Universidade de Auckland, Nova Zelândia. Atualmente é desenvolvido pelo R Development Core Team.
O R possue uma estrutura de código aberto (open source) sendo gratuito com distribuição livre. Parte dos métodos estão implementados no ambiente básico do R (R base), mas muitos métodos estão implementadas em pacotes de funções adicionais (packages). Por ser uma linguagem fácil, como transparência em relação aos métodos e simples para qualquer um criar seu próprio pacote, o R atraiu um grande número de desenvolvedores ao longo do tempo. Atualmente existem mais de 13 mil pacotes disponívels, sendo esse o grande diferencial do porquê usar o R.
Este texto trata aspectos básicos da linguagem R, como sintaxe, operações, tipos e estruturas de dados e importação e exportação de dados e resultados. Os código são brevemente comentados sendo que a ideia é que o leitor seja capaz de reproduzir os comandos aqui contidos, e busque mais informações sobre os argumentos extras nas páginas de ajuda de cada funçõe a fim de exercício. Ao final é apresentado um guia de ajuda rápida mostrando as principais palavras da sintaxe, operadores e funções da linguagem R apresentados aqui.
As versões para Windows, Mac ou Linux podem ser baixadas no site oficial do projeto https://www.r-project.org. Nesse site podem serm encontradas mais informações sobre manuais, pacotes, documentação e novidades sobre o projeto. Além da versão básica existem outras versões, a principal delas é o RStudio. O RStudio é um ambiente de desenvolvimento integrado (IDE - Integrated Development Environment) para Windows, Mac e Linux. O programa é uma espécie de interface para o programa R e oferece um conjunto de ferramentas que facilitam a utilização. A versão de código aberto e gratuita pode ser baixada no site https://www.rstudio.com. A grande vantagem para quem estiver começando a utilizar o R é o recurso de autocompletar funções, argumentos e objetos durante a utilização.
O R funciona por meio de linhas de comandos. É preciso digitar algo para o programa executar. O programa recebe os comandos junto com os dados, executa as funções e retorna os resultados. Tanto o R quanto o RStudio apresentam algumas janelas, cada uma mostra um conjunto de informações. As principais delas são:
Os R gera alguns tipos de arquivos que podem ser salvos. As principais deles são:
O R é uma linguagem de programação orientada a objeto, nele os objetos são atribuidos e salvos automaticamente de maneira temporária em uma área de trabalho (workspace). Ao abrir o R o workspace estará vazio, mas pode-se criar novos objetos para armazenar dados ou resultados de análises. Uma vez armazenados esses objetos podem ser exportados ou salvos em arquivos. Ao fechar o R, os objetos da área de trabalho serão apagados, exceto se foram anteriormente salvos. Ainda, o R sempre fica associado a uma pasta específica do seu computador, essa pasta será o diretório de trabalho (working directory). Os arquivos que estão neste diretório são fáceis de carregar e qualquer arquivo exportado será salvo no diretório caso não especificado o contrário. O diretório de trabalho pode ser alterado, sem qualquer mudanças nos objetos da área de trabalho.
getwd() # Mostrar o diretório de trabalho atual
dir() # Listar os arquivos do diretório
setwd() # Mudar o diretório de trabalho
É possivel salvar a área de trabalho inteira e carregar em outro momento.
Como existem muitos pacotes para R só alguns deles são pré-instalados, os demais precisam ser instalados no computador. O procedimento de instalação precisa ser realizado apenas uma vez (além de atualização de tempos em tempos). Após instalados os pacotes estarão disponívels para uso, mas é preciso carregar o pacote para utilização.
Existem alguns detalhes que são importantes no R. Os principais são:
Ao digitar um comando o programa recebe os dados, executa as funções e retorna os resultados. Os dados de entrada podem ser fornecidos na hora de executar a função ou podem estar guardados em algum lugar da memória (geralmente na área de trabalho). Da mesma forma, os resultados das funções podem ser exibidos na tela ou salvados em algum objeto (geralmente na área de trabalho).
Primeiramente o R pode ser usado como uma calculadora.
2+2 # Soma
[1] 4
8-3 # Subtração
[1] 5
3*8 # Multiplicação
[1] 24
8/2 # Divisão
[1] 4
2^8 # Potências
[1] 256
(2+4)/7 # Prioridade de solução
[1] 0.8571429
Note que acompanhado do resultado é mostrado o [1]. Esse valor indica a posição (índice) do primeiro valor do resultado.
Quase todas as funções do R seguem uma mesma estrutura. É preciso escrever o nome da função, abrir um parêntese, fornecer um ou mais argumentos para ela ser executada e fechar o parêntese.
\[função(argumento1 = valor1, argumento2 = valor2)\] O número de argumentos de uma função é bastante varíavel, podendo variar de 0 a um grande número (geralmente de 1 a 3 argumentos). Por exmplo:
log(x = 8) # Logaritmo natural de 8
[1] 2.079442
rep(x = 1, times = 4) # Repetir o valor 1 quatro vezes
[1] 1 1 1 1
sum(1, 8, 79) # Soma de vários valores
[1] 88
Os valores/objetos para cada argumento precisam estar separados por vírgula (,). É preciso especificar o nome do argumento ou seguir a ordem especificada em cada função.
A função log precisa de dois argumentos:
\[log(x, base)\] onde x é um valor númerico e base é a base que o algoritmo que será calculado.
log(x = 8, base = 2) # Logaritmo de 8 na base 2, especificando cada argumento
[1] 3
log(8, 2) # Logaritmo de 8 na base 2, seguindo a ordem dos argumentos na função
[1] 3
log(base = 2, x = 8) # Logaritmo de 8 na base 2, mudando a ordem dos argumentos. Note...
[1] 3
log(2, 8) # ... que o resultado é diferente se os argumentos não são especificados
[1] 0.3333333
Se verificarmos com detalhes os argumentos da função log vamos encontrar o seguinte:
\[log(x, base = exp(1))\] o argumento base já está preestabelecido (default) sendo esse esse valor é exp(1), ou seja, a função exponential do valor 1, que é usado para para calcular o logaritmo natural.
A função mais importante do R é a função help ou ?. Com essa função é possível encontrar o arquivo de ajuda das funções. Esse arquivo geralmente contêm uma descrição do que a função exatamente faz, dos argumentos necessários, descrição dos resultados, referências e exemplos.
Os principais itens do arquivo de ajuda da função são:
Os exemplos são bastante úteis pois mostram com as funções podem ser executadas. Geralmente eles funcionam com conjuntos de dados que já estão disponíveis dentro do R. Como isso, é possível verificar o funcionamento das funções antes mesmo de organizar seu conjunto de dados.
A função args mostra apenas os argumentos de uma função, o que pode ser útil em alguns casos.
Ainda é possivel pesquisar por assunto, usando a função help.search ou ??. Qualquer documentação com o termo da pesquisa é retornada, incluindo funções de pacotes que não estejam carregados, mas que estejam instalados no computador.
É possível fazer comentários nos códigos e rotinas de análises usando o caracter sustenido (#).
Os objetos dentro do R podem ser salvos temporariamente na área de trabalho (workspace). Essa atribuição pode ser feita usando os símbolos <-, = ou -> e isso pode ser feito com qualquer tipo de objeto. Um resumo da estrutura de qualquer objeto no R por ser vista com a função str.
x <- 15 # O objeto x guarda o valor 15
x # Executando apenas o nome do objeto mostra o valor na tela, no caso 15
[1] 15
x <- 1000 # O objeto x guarda o novo valor. Note que o comando substituiu o valor anterior
x # Novo valor para x, no caso 1000. O valor anterior não pode ser mais recuperado
[1] 1000
X <- 10 # O objeto X guarda o valor 10
X # Valor 10. Note que há diferenças entre o objeto x (minúscula) e o objeto X (maiúsculo)
[1] 10
y <- sum(2, 9 , 43) # O objeto y guarda o resultado da soma
y # Executando apenas o nome do objeto mostra o resultado na tela
[1] 54
z <- y/19 # Operações podem ser feitas diretamente com os objetos
z # Resultado
[1] 2.842105
x <- z # Atribuir ao objeto x o valor do objeto z...
x # ... Desta forma o valor do objeto x é substituido pelo novo valor
[1] 2.842105
str(x) # Mostra um resumo de qualquer objeto do R
num 2.84
Durante a execução do R vários objetos são salvos na área de trabalho (workspace). Para visualizar todos os objetos da área de trabalho é possível utilizar a função ls e para remover a função rm. Os objetos removidos não podem mais ser recuperados.
Alguns caracteres e simbolos são reservados para uso especial dentro do R. Esses devem ser evitados ou não usados fora da proposta original. Os principais estão listados a seguir:
NA # Indeterminado (Not Avaiable)
NaN # Indeterminado (Not a Number)
Inf # Infinito
TRUE # Variável lógica para verdadeiro, ou abreviação T
FALSE # Variável lógica para falso, ou abreviação F
NULL # Usado para especificar algo nulo ou vazio
pi # Contante pi
Também existem algumas função que são composta apenas por uma letra. Nomes de objetos com essas letrasdevem ser evitados.
Os tipos de dados especificados dentro do R podem ser numéricos, caracteres ou lógicos, sendo que cada tipo é usado para um determinado fim.
A dados do tipo numeric são simplesmente número inteiros ou reais. Os números podem serem escritos normalmente ou com notação científica, utiliando o E (ou e).
Os dados do tipo character são caracteres ou texto. São escritos obrigatoriamente entre aspas ("" ou ’’) e não são modificados. Os caracteres podem conter espaços ou acentos, mas isso deve ser utilizado para mostrar resultados finais, como nomes dos eixos em gráficos.
A dados do tipo logical são usados para as palavras que indicam verdadeiro ou falso, sendo as palavras TRUE ou T usadas para inidicar verdadeiro e as palavras palavras FALSE ou F para indicar falso. Não escritos obrigatoriamente com letras maiúsculas sem aspas. São utilizados para indicar opções onde há apenas duas opções ou como resultado de um teste lógico.
Cada dados são organizados em diferentes estruturas. Cada uma delas apresenta um característica e pertence a uma determinada classe. A função class confere a classe de um objeto.
Os vetores (vector) são objetos que armazenam um ou mais elementos, do tipo numeric, character ou logical. Os vetores podem ser criados com a função c, que concaneta objetos. Um vetor só suporta um único tipo de dados. Os vetores ainda possuem duas característica, uma delas é o comprimento que pode ser encontrado com a função length a segunda dela o nomes de cada elemento, acessada pela função names.
numeros <- c(2, 5, 6, 78, 2, 233) # A função c contena os números
numeros
[1] 2 5 6 78 2 233
class(numeros) # Confere a classe, só pode haver uma classe para todo o vetor
[1] "numeric"
is.vector(numeros) # Confere se o objeto é um vetor
[1] TRUE
length(numeros) # Mostra o comprimento do vetor
[1] 6
names(numeros) # Não há nomes
NULL
names(numeros) <- c("n1", "n2", "n3", "n4", "n5", "n6") # Atribuir nomes ao vetor numeros
names(numeros) # Os nomes do vetor
[1] "n1" "n2" "n3" "n4" "n5" "n6"
letras <- c("a", "b", "c", "d", "e", "f") # Classe character
letras
[1] "a" "b" "c" "d" "e" "f"
class(letras)
[1] "character"
logico <- c(F, T) # Classe logical
logico
[1] FALSE TRUE
class(logico)
[1] "logical"
Como um vetor só tem uma dimensão, para acessar um determinado valor do vetor é preciso fornecendo a posição do elemento no vetor entre colchetes ([]). Podem ser acessados um ou mais valores ao mesmo tempo. Se fornecer um valor com o sinal de menos na frente (-), todos os valores serão selecionados, exceto a posição em questão. Ainda, nos vetores com nomes é possível fazer a indexação usando o nome do elemento ou dados lógicos.
numeros[2] # Seleciona o segundo valor do vetor
n2
5
numeros[c(3, 6, 1)] # Seleciona o terceiro, sexto e primeiro valor do vetor
n3 n6 n1
6 233 2
numeros[1:3] # Seleciona os primeiros três valores do vetor
n1 n2 n3
2 5 6
numeros[12] # Índece fora dos limites, retorna um NA
<NA>
NA
numeros[-3] # Seleciona tudo, exceto o terceiro valor
n1 n2 n4 n5 n6
2 5 78 2 233
numeros["n5"] # Seleciona o elemento com nome n5, no caso o quinto elemento
n5
2
numeros[c(TRUE, FALSE, F, F, F, T)] # Seleciona o elemento o primeiro e último elemento
n1 n6
2 233
numeros[1] <- 12 # muda o valor do item 1 vetor numeros
A classe factor serve para designar categorias para um vetor. Essa classe é semelhante a um vetor da classe character, mas tem importancia maior nas análises estatísticas já que designam um número finito (predefinido) de categorias. Tanto números quanto caracteres podem ser convertidos em fatores usando a função factor. Esses fatores podem não serem ordenados representado apenas diferentes categorias ou podem representar categorias ordenadas. A função ordered gera fatores ordenados, ou seja que as categorias tem diferentes níveis que são maiores uns que os outros.
fator1 <- factor(c("Co", "Co", "Co", "Tr", "Tr", "Tr")) # Fator a partir de caracteres
fator1
[1] Co Co Co Tr Tr Tr
Levels: Co Tr
class(fator1)
[1] "factor"
is.factor(fator1) # Confere se o objeto é um da classe factor
[1] TRUE
levels(fator1) # Confere as categorias do fator
[1] "Co" "Tr"
nlevels(fator1) # Confere o número de categorias do fator
[1] 2
is.ordered(fator1) # Confere se o fator é ordenado ou não
[1] FALSE
fator2 <- ordered(c(1, 1, 2, 2, 3, 3), levels = c(3, 2, 1)) # Cria um fator ordenado
fator2 # Note que a um símbolo de < para indicar a ordem
[1] 1 1 2 2 3 3
Levels: 3 < 2 < 1
levels(fator2) # Confere as categorias do fator
[1] "3" "2" "1"
is.ordered(fator2) # Confere se o fator é ordenado ou não
[1] TRUE
fator2 <- ordered(fator2, levels = c(2, 1, 3)) # É possível alterar a ordem dos níveis
fator2
[1] 1 1 2 2 3 3
Levels: 2 < 1 < 3
A indexação dos fatores funciona exatamente da mesma maneira que os vetores.
fator1[2] # Seleciona o segundo valor do fator
[1] Co
Levels: Co Tr
fator1[2] <- "Tr" # mudar de fator
fator1 # nívels permanecem
[1] Co Tr Co Tr Tr Tr
Levels: Co Tr
fator1[1] <- "z" # fator inválido
Warning in `[<-.factor`(`*tmp*`, 1, value = "z"): invalid factor level, NA generated
fator1 # NA é gerado
[1] <NA> Tr Co Tr Tr Tr
Levels: Co Tr
Tabelas de dados podem ser organizadas em data.frames usando a função data.frame. Os data.frames são tabelas que armazenam um ou mais vetores de dados. Por essas características eles possuem duas dimensões, linhas e colunas. Cada coluna, será um vetor, podendo portando armazenar vetores de diferentes tipos (numeric, character ou logical), entretanto o comprimento de todos vetores de um data.frame deve ser igual. Os data.frames possuem duas dimensões que podem ser encontradas com a função dim, nrow e ncol. Os nomes das linhas e colunas podem ser acessada pelas função rownames e colnames respectivamente. As funções str, head e tail mostram parte do data.frame para que sejá possível conferir os dados sem a nescessidade de visualizar a tabela completa.
dados <- data.frame(valores = numeros, letras, categorias = y) # Combinar vetores em ...
dados # ... um data.frame. Sempre por colunas
valores letras categorias
n1 12 a FALSE
n2 5 b FALSE
n3 6 c FALSE
n4 78 d FALSE
n5 2 e FALSE
n6 233 f FALSE
str(dados) # Resumo do data.frame
'data.frame': 6 obs. of 3 variables:
$ valores : num 12 5 6 78 2 233
$ letras : chr "a" "b" "c" "d" ...
$ categorias: logi FALSE FALSE FALSE FALSE FALSE FALSE
head(dados, n = 3) # Mostra as 3 primeiras linhas
valores letras categorias
n1 12 a FALSE
n2 5 b FALSE
n3 6 c FALSE
tail(dados, n = 2) # Mostra as 2 últimas linhas
valores letras categorias
n5 2 e FALSE
n6 233 f FALSE
dim(dados) # Dimensões do data.frame, primeiro linhas o depois colunas
[1] 6 3
nrow(dados) # Número de linhas
[1] 6
ncol(dados) # Número de colunas
[1] 3
rownames(dados) # Nomes das linhas
[1] "n1" "n2" "n3" "n4" "n5" "n6"
colnames(dados) # Nomes das colunas
[1] "valores" "letras" "categorias"
Os data.frames possuem duas dimensões, para acessar um determinado valor é preciso fornecer a posição na linha e da coluna. Os valores são fornecidos entre colchetes ([ , ]), sepadaos por vírgula, sendo o primeiro valor a posição da linha e o segundo a posição da coluna. Como nos vetores podem ser acessados um ou mais linhas e colunas ao mesmo tempo e excluir da seleção determinadas linhas e colunas utilizando o sinal de menos (-) antes da posição. Além disso, é possível fazer a indexação das linhas e colunas usando nome entre aspas (""), ainda as colunas podem ser acessadas com símbolo cifrão ($). Se for selecionado apenas uma coluna, o R automaticamente transforma a seleção da classe data.frame para a classe vector. Para evitar que isso acontece é preciso fornecer um terceiro argumento dentro dos colchetes drop = FALSE ([ , , drop = FALSE]).
dados[2, 1] # Valor da linha 2 e coluna 1
[1] 5
dados[c(1,4), 2:3] # Linhas 1 e 4 das colunas 2 e 3
letras categorias
n1 a FALSE
n4 d FALSE
dados[2,] # Linha 2 com todas as colunas
valores letras categorias
n2 5 b FALSE
dados[, 2] # Coluna 2 com todas as linhas
[1] "a" "b" "c" "d" "e" "f"
dados[, 2, drop = FALSE] # Coluna 2 com todas as linhas, mantendo a estrutura de tabela
letras
n1 a
n2 b
n3 c
n4 d
n5 e
n6 f
dados[, -3] # Seleciona tudo, exceto a terceira coluna
valores letras
n1 12 a
n2 5 b
n3 6 c
n4 78 d
n5 2 e
n6 233 f
dados[, "letras"] # Seleciona a coluna chamada letras
[1] "a" "b" "c" "d" "e" "f"
dados["n1" ,] # Seleciona a linha chamada n1
valores letras categorias
n1 12 a FALSE
dados$valores # Seleciona a coluna chamada valores
[1] 12 5 6 78 2 233
dados$novo.vetor <- c("x", "y", "z", "x", "y", "z") # Adicionar vetor...
str(dados) # ... nesse caso a classe permanece
'data.frame': 6 obs. of 4 variables:
$ valores : num 12 5 6 78 2 233
$ letras : chr "a" "b" "c" "d" ...
$ categorias: logi FALSE FALSE FALSE FALSE FALSE FALSE
$ novo.vetor: chr "x" "y" "z" "x" ...
dados$novo.vetor <- NULL # Deletar um vetor do data.frame (apenas colunas)
dados
valores letras categorias
n1 12 a FALSE
n2 5 b FALSE
n3 6 c FALSE
n4 78 d FALSE
n5 2 e FALSE
n6 233 f FALSE
Matrizes, da classe matrix, são praticamente iguais aos data.frames usando a função matrix ou com a combinação de vetores com as função cbind e rbind (concatena os vetores por coluna ou por linhas respectivamente). A diferença fundamental são que as matrizes só podem armazenar um tipo de dado, geralmente dados numéricos. Matematicamente isso é bastante importante pois se espera que as linhas e colunas das matrizes tenham relação umas com as outras. Como os data.frames, as matrizes possuem duas dimensões que podem ser encontradas com a função dim, nrow e ncol. Os nomes das linhas e colunas podem ser acessada pelas função rownames e colnames respectivamente. As funções str, head e tail também funcionam com matrizes. Além disso, as matrizes podem ser transpostas com a função t.
matriz <- matrix(c(1, 2, 3, 11, 12, 13), nrow = 3, ncol = 2) # Matriz, 3 x 2
matriz
[,1] [,2]
[1,] 1 11
[2,] 2 12
[3,] 3 13
str(matriz) # Resumo da matriz
num [1:3, 1:2] 1 2 3 11 12 13
head(matriz, n = 1) # Mostra a primeira linha
[,1] [,2]
[1,] 1 11
tail(matriz, n = 1) # Mostra a última linha
[,1] [,2]
[3,] 3 13
dim(matriz) # Dimensões da matriz, primeiro linhas o depois colunas
[1] 3 2
nrow(matriz) # Número de linhas
[1] 3
ncol(matriz) # Número de colunas
[1] 2
rownames(matriz) # Nomes das linhas, nesse caso NULL
NULL
colnames(matriz) # Nomes das colunas, nesse caso NULL
NULL
t(matriz) # Transpor a matriz
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 11 12 13
matriz.por.colunas <- cbind(numeros, letras) # Concatenados por colunas
matriz.por.linhas <- rbind(numeros, letras) # Concatenados por linhas
matriz.por.colunas # Note que os números ficaram entre aspas, indicando...
numeros letras
n1 "12" "a"
n2 "5" "b"
n3 "6" "c"
n4 "78" "d"
n5 "2" "e"
n6 "233" "f"
matriz.por.linhas # ... que foram convertidos em caracteres
n1 n2 n3 n4 n5 n6
numeros "12" "5" "6" "78" "2" "233"
letras "a" "b" "c" "d" "e" "f"
A indezação de matrizes funciona exatamente igual a indexação dos data.frames.
matriz[1, 1] # Valor da linha 1 e coluna 1
[1] 1
matriz[1, 1, drop = FALSE] # Valor da linha 1 e coluna 1, mantendo a estrutura da matriz
[,1]
[1,] 1
matriz[-3, , drop = FALSE] # Seleciona tudo, exceto a terceira linha
[,1] [,2]
[1,] 1 11
[2,] 2 12
matriz[3, 1] <- 0 # Nada pode ser deletado, apenas alterado o valor (incluindo NA)
matriz <- matriz[,c(2, 1)] # Mudar a ordem das colunas
matriz
[,1] [,2]
[1,] 11 1
[2,] 12 2
[3,] 13 0
Listas são objetos que podem armazenam quaisquer outros tipos de objetos, são pertencentes as classe list. As listas são criadas com a função list e por serem objetos bastante genérios e versáteis muitas vezes são usadas para armazenar os resultados de funções. As listas possuem apenas uma dimensão, que pode ser acessada pela função length, além disso, podem ter nomes, acessados pela função names e um resumo pode ser visto pela função str.
minha.lista <- list(matriz, 1, fator1) # Lista com objetos variados
minha.lista
[[1]]
[,1] [,2]
[1,] 11 1
[2,] 12 2
[3,] 13 0
[[2]]
[1] 1
[[3]]
[1] <NA> Tr Co Tr Tr Tr
Levels: Co Tr
str(minha.lista) # Estrutura da lista
List of 3
$ : num [1:3, 1:2] 11 12 13 1 2 0
$ : num 1
$ : Factor w/ 2 levels "Co","Tr": NA 2 1 2 2 2
length(minha.lista) # Mostra o comprimento do vetor
[1] 3
names(minha.lista) <- c("A", "B", "C") # Atribui nomes a lista
minha.lista
$A
[,1] [,2]
[1,] 11 1
[2,] 12 2
[3,] 13 0
$B
[1] 1
$C
[1] <NA> Tr Co Tr Tr Tr
Levels: Co Tr
A indezação de listas funciona praticamente igual a indexação dos vetores, com a diferença que existem dois modelos de idexação. Se usado apenas um par de colchetes ([]) uma sublista é retornada, para indexar o conteúdo da lista é preciso de dois colchetes ([[ ]]). Além disso, as listas com nomes podem ser indexadas usando os nomes entre aspas ("") ou com o símbolo do cifrão ($). Os objetos dentro de uma lista podem ser acessados de maneira convencionar, sendo possível armazenar uma lista dentro de outra.
minha.lista[1] # Acessar primeira sublista
$A
[,1] [,2]
[1,] 11 1
[2,] 12 2
[3,] 13 0
minha.lista[[1]] # Primeiro objeto da lista
[,1] [,2]
[1,] 11 1
[2,] 12 2
[3,] 13 0
minha.lista[["C"]] # Objeto com o nome C na lista
[1] <NA> Tr Co Tr Tr Tr
Levels: Co Tr
minha.lista$A # Objeto com o nome A na lista
[,1] [,2]
[1,] 11 1
[2,] 12 2
[3,] 13 0
minha.lista[[1]][3, 2] # Primeiro objeto da lista (uma matriz), linha 3, coluna 2
[1] 0
minha.lista[c(2:3)] # Acessar várias sublistas. minha.lista[[c(2:3)]] não funciona
$B
[1] 1
$C
[1] <NA> Tr Co Tr Tr Tr
Levels: Co Tr
minha.lista[["C"]] <- NULL # Deletar item da lista. Mesmo que minha.lista["C"]
minha.lista$novoitem <- 1:3 # Adicionar item a lista
minha.lista
$A
[,1] [,2]
[1,] 11 1
[2,] 12 2
[3,] 13 0
$B
[1] 1
$novoitem
[1] 1 2 3
As dados e estruturas podem ser convertidas em outras tipos ou classes utilizando as funções as.numeric, as.character, as.logical e as.factor, as.ordered, entre outras. É preciso ter cuidado para não fazer uma conversão que não faça sentido.
x <- as.character(numeros) # Classe numeric para character
x
[1] "12" "5" "6" "78" "2" "233"
x <- as.character(fator1) # Classe factor para character
x
[1] NA "Tr" "Co" "Tr" "Tr" "Tr"
x <- as.numeric(letras) # Classe character para numeric não faz sentido
Warning: NAs introduced by coercion
x
[1] NA NA NA NA NA NA
x <- as.numeric(fator1) # Classe factor para numeric
x # Nesse caso é preciso ter cuidado pois o número da categoria fica como numeric
[1] NA 2 1 2 2 2
x <- c(0, 1, 0) # Vetor apenas de 0 e 1...
x
[1] 0 1 0
x <- as.logical(x) # ... pode ser convertido em logical
x # Os valores de 0 ficam como FALSE e valores defetentes de 0 ficam TRUE
[1] FALSE TRUE FALSE
Existem várias maneiras de entrar com dados no R. As mais simples e práticas são utilizando planilhas de dados no formato .csv (Comma-separated values) ou .txt (separado por tabulações). Esses dois formatos são arquivos de texto simples usado para armazenar tabelas de dados, eles podem ser lidos em qualquer programa de edição de texto e podem ser salvos diretamente os programas de edição de planilhas. O .csv apresentar como separador entre tabelas a vírgula (,) já o .txt separado por tabulações o símbolo de tab. As duas principais funções para carregar os dados são read.csv e read.table, sendo que por padrão o símbolo de separação de colunas é vírgula para .csv e tab para .txt. Os principais argumentos destas funções são relacionados aos nomes das das linhas e colunas. Se a primeira linha do arquivo de dados for composta pelos nomes das colunas o argumentos header das funções deve ser verdadeiro. Já se a primeira coluna do arquivo contêm os nomes das linhas o argumento row.names deve ser igual a 1, indicando da coluna que contêm os nomes.
Para o evitar problemas é importante evitar uso de caracteres especiais, como espaços, acentos, células em branco. Use os símbolos de ponto (.) ou underline (_) nos lugares dos espaços e NA para indicar células faltantes no arquivo de dados. O arquivo .txt é mais difícil e exigente quanto a formatação que .cvs que é mais versátil e fácil para entrar com dados.
O arquivo eidat.csv são 10 observações e 4 variáveis de dados simulados para ilustrar modelos de inferência ecológica. O arquivo PlantGrowth.csv são 30 observações e 2 variáveis de dados de resultados de um experimento para comparar os rendimentos obtidos sob controle e dois tratamentos. Os dados são disponibilizados em https://vincentarelbundock.github.io/Rdatasets/datasets.html
eidat <- read.csv("eidat.csv", row.names = 1, header = TRUE)
eidat # Conferir se os dados foram carregados corretamente
x0 x1 t0 t1
1 200 3911 2850 1261
2 162 2636 1541 1257
3 206 2460 1091 1575
4 213 1654 517 1350
5 209 637 163 683
6 190 1911 216 1885
7 206 3460 226 3440
8 190 715 102 803
9 183 2058 126 2115
10 189 2658 138 2709
str(eidat)
'data.frame': 10 obs. of 4 variables:
$ x0: int 200 162 206 213 209 190 206 190 183 189
$ x1: int 3911 2636 2460 1654 637 1911 3460 715 2058 2658
$ t0: int 2850 1541 1091 517 163 216 226 102 126 138
$ t1: int 1261 1257 1575 1350 683 1885 3440 803 2115 2709
colnames(eidat)
[1] "x0" "x1" "t0" "t1"
rownames(eidat)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
plantas <- read.csv("PlantGrowth.csv", row.names = 1, header = TRUE,
stringsAsFactors = TRUE)
str(plantas)
'data.frame': 30 obs. of 2 variables:
$ weight: num 4.17 5.58 5.18 6.11 4.5 4.61 5.17 4.53 5.33 5.14 ...
$ group : Factor w/ 3 levels "ctrl","trt1",..: 1 1 1 1 1 1 1 1 1 1 ...
head(plantas) # Conferir parte inicial do objeto
weight group
1 4.17 ctrl
2 5.58 ctrl
3 5.18 ctrl
4 6.11 ctrl
5 4.50 ctrl
6 4.61 ctrl
tail(plantas) # Conferir parte final do objeto
weight group
25 5.37 trt2
26 5.29 trt2
27 4.92 trt2
28 6.15 trt2
29 5.80 trt2
30 5.26 trt2
Além de carregar os arquivos diretamente da pasta de trabalho também é possível escolher um arquivo de maneira interativa usando a função file.choose. Outra opçõe é usar as opções copiar e colar do sistema operacionar usando as opções “clipboard” ou pipe(“pbpaste”). Essas opções parecem ser fáceis em um primeiro momento, mas com o tempo se tornam mais complicadas, pois não é registrado qual arquivo exatamente foi usado em uma determinada rotina de análise. É preferiver carregar os arquivos diretamente usando o nome do arquivo dentro da pasta de trabalho.
O R pode realizar muitas operações aritméticas, lógicas ou estatísticas de maneira muito simplificada. Essas operações podem ser aplicadas em objetos, vetores ou data.frames inteiros.
ex1 <- c(4, 8.987, 48.04, 3.22, 43, 2.34) # Números positivos
ex1
[1] 4.000 8.987 48.040 3.220 43.000 2.340
ex2 <- c(-12, -8.12, 2100, 7, NA, -57.3) # Números, negativos e faltantes
ex2
[1] -12.00 -8.12 2100.00 7.00 NA -57.30
ex3 <- c(8, 9, 1.65, 12.8, 1, 199) # Mais números
ex3
[1] 8.00 9.00 1.65 12.80 1.00 199.00
A <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3) # Matriz, 2x3
A
[,1] [,2] [,3]
[1,] 1 3 12
[2,] 2 11 13
B <- matrix(c(12,29,10, 18,28,54, 9, 7, 35), nrow = 3, ncol = 3) # Matriz, 3x3
B
[,1] [,2] [,3]
[1,] 12 18 9
[2,] 29 28 7
[3,] 10 54 35
ex1+100 # Somar uma contante ao vetor
[1] 104.000 108.987 148.040 103.220 143.000 102.340
ex1^2 # Elevar ao quadrado o vetor
[1] 16.00000 80.76617 2307.84160 10.36840 1849.00000 5.47560
max(ex1) # Máximo
[1] 48.04
min(ex1) # Mínimo
[1] 2.34
sum(ex1) # Somar todos os valores do vetor
[1] 109.587
sum(ex2) # Quando existe algum NA o resultado é NA, mas...
[1] NA
sum(ex2, na.rm = TRUE) # ... é possível remover os NA da operação
[1] 2029.58
factorial(6) # Fatorial
[1] 720
log(ex1) # Logaritmo
[1] 1.3862944 2.1957791 3.8720340 1.1693814 3.7612001 0.8501509
sqrt(ex1) # Raiz quadrada
[1] 2.000000 2.997833 6.931089 1.794436 6.557439 1.529706
sqrt(ex2) # Raiz quadrada, retorna um NaN, pois não há raiz de números negativos
Warning in sqrt(ex2): NaNs produced
[1] NaN NaN 45.825757 2.645751 NA NaN
abs(ex1) # Valores absoluto
[1] 4.000 8.987 48.040 3.220 43.000 2.340
A%*%B # Multiplicação de matrizes, A vezes B
[,1] [,2] [,3]
[1,] 219 750 450
[2,] 473 1046 550
rowSums(A) # Soma das linhas
[1] 16 26
colSums(A) # Soma das colunas
[1] 3 14 25
round(ex1, digits = 1) # Arredondar número para 1 dígito decimal
[1] 4.0 9.0 48.0 3.2 43.0 2.3
sort(ex1) # Organizar em ordem crescente
[1] 2.340 3.220 4.000 8.987 43.000 48.040
sort(ex1, decreasing = TRUE) # Organizar em ordem decrescente
[1] 48.040 43.000 8.987 4.000 3.220 2.340
order(ex1) # Obter posição (não o valor!) de cada valor na ordem crescente...
[1] 6 4 1 2 5 3
ex1[order(ex1)] # ... é possível reorganizar os números conforme essa ordem obtida
[1] 2.340 3.220 4.000 8.987 43.000 48.040
valor <- 0.83 # Valor de exemplo
valor
[1] 0.83
valor < 0.9 # Menor (> para maior)
[1] TRUE
valor <= 0.83 # Menor ou igual (>= para maior ou igual)
[1] TRUE
valor == 9 # valor exatamente igual
[1] FALSE
valor != 0.8 # valor diferente de
[1] TRUE
ex1 == 4 # Podem ser aplicados a vetores
[1] TRUE FALSE FALSE FALSE FALSE FALSE
0<=valor & valor<=0.1 # Dois criterios aditivos
[1] FALSE
0<=valor | valor<=0.1 # Dois criterios, um ou outro
[1] TRUE
!valor == 0.83 # Inverter o argumento lógico
[1] FALSE
ifelse(ex1>4, yes = "M", no = "F") # Teste condicional para categorizar valores
[1] "F" "M" "M" "F" "M" "F"
mean(ex1) # Média
[1] 18.2645
median(ex1) # Mediana
[1] 6.4935
var(ex1) # Variância
[1] 453.58
sd(ex1) # Desvio padrão
[1] 21.29742
cor(ex1, ex3) # Correlação entre ex1 e ex3
[1] -0.415766
cor(ex1, ex3, method = "spearman") # Correlação entre ex1 e ex3 usando Spearman
[1] -0.8857143
cov(ex1, ex3) # Covariação entre ex1 e ex3
[1] -697.0587
Muitas funções que auxiliam na geração de sequências númericas ou de caracteres, extrai números de distribuições estatísticas e realizar procedimentos de amostragem.
1:10 # Sequência de 1 a 10
[1] 1 2 3 4 5 6 7 8 9 10
-9:1 # Sequência de -9 a 1
[1] -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1
seq(from = 1, to = 10, by = 2) # Sequência regulare de 1 a 10 por 2
[1] 1 3 5 7 9
seq(from = 1, to = 3, length.out = 8) # Sequência regulare de 1 a 3, com 8 valores
[1] 1.000000 1.285714 1.571429 1.857143 2.142857 2.428571 2.714286 3.000000
seq_len(12) # Sequência de inteiros de 1 a 12
[1] 1 2 3 4 5 6 7 8 9 10 11 12
paste("A", 1:6, sep = ".") # Sequência regular de caracteres
[1] "A.1" "A.2" "A.3" "A.4" "A.5" "A.6"
rep(3, 6) # Repetir o valor 3 por 6 vezes
[1] 3 3 3 3 3 3
rep(1:4, 3) # Repetir a sequência 1 a 4 por 3 vezes
[1] 1 2 3 4 1 2 3 4 1 2 3 4
rep(1:4, each = 3) # Repetir os valores 1 a 4 por 3 vezes cada
[1] 1 1 1 2 2 2 3 3 3 4 4 4
runif(5, min = 0, max = 10) # Gerar distribuição uniforme, entre 0 e 10...
[1] 6.742459 8.103175 3.738857 1.388355 3.277760
runif(5, min = 0, max = 10) # ... Note que é diferente a cara execução
[1] 7.8895152 3.0344302 1.6837370 4.8089219 0.5780624
rnorm(5, mean = 0, sd = 1) # Gerar distribução normal com média 0 e variância 1
[1] -0.57249929 -1.73642564 0.59179279 -1.28624999 0.05649468
rpois(5, lambda = 1) # Gerar distribuição de Poisson, com lambda 1
[1] 3 1 1 1 0
sample(1:10, size = 4) # Amostrar 4 valores da sequência de 1 a 10 sem reposição...
[1] 7 6 5 9
sample(1:10, size = 4, replace = TRUE) # ... Amostrar com reposição
[1] 10 6 10 1
moeda <- c("cara","coroa") # Vetor com resultados de uma moeda
moeda
[1] "cara" "coroa"
sample(moeda, size = 1) # Amostrar um resultado
[1] "coroa"
sample(moeda, size = 3, replace = TRUE) # Amostrar 3 vezes, replace deve ser verdadeiro
[1] "coroa" "cara" "cara"
As funções básicas aplicadas a vetores também podem ser aplicadas facilmente a data.frames, matrizes ou listas. Essas funções requerem bastante atenção na definição dos parâmetros por serem bastante versáteis e facilitam aplicação de cálculos mais complexos. Algumas deles são listadas a seguir.
sapply(eidat, sum) # Aplicar função sum em cada vetor do data.frame/listas
x0 x1 t0 t1
1948 22100 6970 17078
apply(eidat, MARGIN = 2, sum) # Aplicar função sum matrizes/data.frames...
x0 x1 t0 t1
1948 22100 6970 17078
# ... Quando MARGIN é 2 por colunas, quando 1 é por linhas
apply(eidat, MARGIN = 1, sd) # Aplicar função sd matrizes/data.frames
1 2 3 4 5 6 7 8 9
1648.0515 1016.6392 941.1670 679.5059 274.9497 978.7238 1867.1865 357.5439 1115.9261
10
1455.2206
replicate(n = 3, expr = sample(moeda, size = 1)) # Replicar função/expressão por 3 vezes
[1] "cara" "cara" "cara"
tapply(plantas$weight, INDEX = plantas$group, FUN = mean) # Aplicar mean por plantas$group
ctrl trt1 trt2
5.032 4.661 5.526
table(plantas$group) # Tabela de contingência das contagens em cada categoria
ctrl trt1 trt2
10 10 10
A função plot é uma função genérica que produz gráficos de maneira automático dependendo do tipo de informação e classe do objeto passado para ela. Quando apropriado, os eixos, nomes dos eixos e títulos são gerados automaticamente. Existem diversas funções auxiliares para adicionar elementos aos gráficos. Um texto mais completo sobre gráficos pode ser encontrado em https://vanderleidebastiani.github.io/tutoriais.
Assim como para importar dados, para exportar há muitas funções para exportar dados. Para exportar tabelas completas é possível usar as funções write.table ou write.csv, basta especificar o objeto com a tabela completa e o nome do arquivo de saída. O arquivo será salvo no diretório de trabalho do R. Para exportar os resultados de análises para visualização é melhor usar o Rmarkdown (um texto básico pode ser encontrado em https://vanderleidebastiani.github.io/tutoriais).
# - Adicionar comentário
? - Obter ajuda de função
?? - Relizar buscar
<- ou = - Atribuir objeto (direita para esquerda)
-> - Atribuir objeto (esquerda para direita)
+ - Somar
- - Subtrair
* - Multiplicar
/ - Dividir
^ - Potêncializar (direita para esquerda)
%*% - Multiplicar matrizes
< - Comparar, menor
> - Comparar, maior
<= - Comparar, menor ou igual
>= - Comparar, maior ou igual
== - Comparar, exatamente igual
!= - Comparar, diferente
! - Lógico, NÃO. Inverter resultado de teste lógico
& - Lógico, critério aditivo E. Operação elementar
| - Lógico, critério aditivo OU. Operação elementar
&& - Lógico, E
|| - Lógico, OU
~ - Fórmula estatística
FALSE ou F - Argumento lógico falso
TRUE ou T - Argumento lógico verdadeiro
NA - Indeterminado (Not Avaiable)
NaN - Indeterminado (Not a Number)
Inf - Infinito
NULL - Objeto nulo
c() - Concatenar valores em vetor
factor() - Criar fator
ordered() - Criar fator ordenado
data.frame() - Criar tabela de dados (data.frames)
matrix() - Criar matriz
list() - Criar lista
rbind() - Combinar vetores por linhas
cbind() - Combinar vetores por colunas
paste() - Concatenar caracteres em sequências regulares
class() - Conferir/Atribuir classe do objeto
str() - Conferir estrutura do objeto
: - Gerar sequência numérica contínua
$ - Indexar vetores/listas pelo nome das variáveis/listas
@ - Indexar na classe S4
[] - Indexar vetores/listas
[ , , drop = FALSE] - Indexar data.frames/matrizes. Primeiro valor linha, segundo coluna
[[]] - Indexar listas
names() - Conferir/Atribuir nomes a vetores/listas
colnames() - Conferir/Atribuir nomes as linhas de data.frames/matrizes
rownames() - Conferir/Atribuir nomes as colunas de data.frames/matrizes
length() - Conferir comprimento de vetores/listas
dim() ou nrow() e ncol() - Conferir dimensões de data.frames/matrizes
head() e tail() - Conferir início e fim de data.frames/matrizes
t() - Transpor data.frames/matrizes
seq() - Obter sequência regular
rep() - Repetir valores
ifelse() - Aplicar teste condicional
read.csv() ou read.table() - Importar tabelas
write.csv() ou write.table() - Exportar tabelas
ls() - Listar objetos da área de trabalho
rm() - Remover objetos da área de trabalho
save.image() - Salvar área de trabalho
load() - Carregar área de trabalho
max() - Obter máximo
min() - Obter mínimo
sum() - Obter soma
sqrt() - Obter raiz quadrada
log() - Obter logaritmo
exp() - Obter função exponential
abs() - Obter valores absoluto
round() - Arredondar valores
factorial() - Obter fatorial
mean() - Obter média
median() - Obter mediana
var() - Obter variância
sd() - Obter desvio padrão
cor() - Obter correlação
cov() - Obter covariação
runif() - Gerar distribuição uniforme
rnorm() - Gerar distribução normal
rpois() - Gerar distribuição de Poisson
sample() - Amostrar valores
sort() - Ordenar valores
order() - Obter posição da order dos valores
which() - Procurar posição (índice) conforme teste lógico
sapply() - Aplicar função em data.frames/listas
tapply() - Aplicar função em vetores
apply() - Aplicar função em data.frames/matrizes
replicate() - Replicar expressões
table() - Produzir tabelas de contingência
O objetivo deste texto foi introduzir alguns conceitos básicos da linguagem R. Os principais aspectos da sintaxe, operadores, tipos de dados e estruturas dos objetos foram mostradas e brevemente exemplificados. Espero que este texto tenha sido útil e, por favor, avise-me se tiver dúvidas ou sugestões sobre este texto.
Outros textos e tutoriais sobre R podem ser encontrados em https://vanderleidebastiani.github.io/tutoriais.
Crawley, Michael J. 2007. The R book. John Wiley & Sons, Chichester.
R Core Team; 2018. R Language Definition. https://cran.r-project.org/doc/manuals/R-lang.html